I vote for not enabling internal pull-ups as the default. This will provide a hard failure if there are no external pull-ups.
My printInfo() function will indicate a pull-up problem like this:
Last return status: Failure
Failure state: 0XD0, Start condition timeout. Pull-up problem?
Transfer request size: 1
Bytes transfered: 0
Curent state: 0XF8, Stop condition or busy; TWINT == 0.
The user can then decide whether to try enabling pull-ups with a begin() call like this:
twi.begin(I2C_100KHZ, I2C_INTERNAL_PULLUPS);
Hopefully that will cause the user to read the description of begin() and the warnings about pull-ups.
The printInfo() function provides a way to diagnose problems. It takes about 1200 bytes of flash program space when you use it. It has a lot of text stored in flash. There is no overhead if you don't use it.
For a board with external pull-ups, the these calls:
twi.transfer(RTC_WRITE, &rtcAdd, 1, I2C_REP_START);
twi.printInfo(&Serial);
Result in this message:
Last return status: Success
Transfer request size: 1
Bytes transfered: 1
Curent state: 0X10, A Repeated START has been transmitted.