Does I2C need pull-up resistors on SCL and SDA?

The Wikipedia entry on 'Pull-up resistor' says that pull-up resistors are needed on the SCL and SDA lines for I2C. Is this really the case?

It seems reasonable to assume that any reputable slave device would already have such pull-ups if they are necessary, but should one always software-enable internal pull-ups on these pins in the master chip as a precaution against incorrect data? Or are hardware pull-ups recommended? I seem to be getting away without doing either, but I don't want my project to fail for want of a line of code or a couple of resistors.

Yes it's really the case. Remember it's a bus. I could attach, say, six slave devices on the bus. If they all had pullups, the resistors would all be in parallel and would result in much less resistance than desired. Think of the pullups as part of the bus; both being the responsibility of the designer and not that of the slave devices.

The Arduino Wire library turns on the internal pullups and it is widely reported that this works. However, the internal pullups (~35K) are far larger than the typical values recommended (4.7K for 100kHz, 2.2K for 400kHz). I always include external pullups, one of those two values.

Thanks, Jack, that's very helpful.