I think your example does not represent the case under discussion.
The shift8 function return of the byte only returns the low byte the promoted int.
byte shift8 (byte x)
{
Serial.println(x<<8);
return x << 8;
}
void setup() {
Serial.begin(9600);
int y = shift8(1);
Serial.println(y);
}
void loop() {
}
In the original posted code, the bit shifting is acting on the byte returned value, and the combination of two Wire.read() values into an int is like this
void setup() {
Serial.begin(9600);
byte x = 1;
byte y = 1;
int z = x<<8|y;
Serial.print(z);
}
void loop() {}
The issue of type promotion during shifts has puzzled me for a while, so I have always used constructs like (unsigned int)Wire.read()<<8 and will continue to do so.
It's probably a good practice and the explicit casting is important when combining bytes into something larger than a 16 bit integer. I do not think it is required for the simple two byte combination into a 16 bit integer.