My example suggests otherwise.
You are correct in that if the function returns a byte, the result is a byte. However, your function was returning the low byte (which was 0) of a two byte integer value. This integer value within the function was the result of integer promotion by the arithmetic operation within the function.
In my last example the bitshift <<8 operates on the returned byte, and that byte (after it has been returned by the function) is promoted to an int by the arithmetic operator.
Wire.read() returns an int, which is why it works.
This bitshifting <<8 of the first byte and and or_ing with the second received byte to create an int works with EEPROM.read() and Serial.read(). I don't think that they both return an int like Wire.read().
However, getting into the habit of the explict cast like you do, can not go wrong.
Unfortunately, this part of the discussion started with my reaction to @PaulS implication that the OPs code had a problem with the <<8.
I probably should have let it go by.