I2C buses are not limited to a defined voltage. In some applications different I2C reference voltages are used for different ICs. Sometimes it is necessary to have all of them sharing the same bus. To be able to recognize what a logical zero and logical one is, a level-shifter is necessary.
Different to most interfaces the I2C bus does not have a dedicated direction, e.g. multiple devices may pull the SCL line to ground.
This causes serious problems building level shifters since they have to take care of moving a request from one side to the other and vice versa without introducing back coupling and oscillation. The basic idea to handle this is to limit the bandwidth on the bus. This gives poor transfer-rates of course.
A basic idea on how to build a level shifter
The semiconductors company NXP offers some I2C Voltage level translators.