JTable usa questa logica per determinare il renderer da usare per una cella:
1) C'è un renderer assegnato specificatamente alla colonna (TableColumn)? Sì: usa quello. No: chiede il renderer a getDefaultRenderer passando il "column class" (da getColumnClass).
2) getDefaultRenderer prima cerca un renderer per quel class X, se non c'è allora per la superclasse di X, se non c'è per la superclasse della superclasse di X, ecc...
JTable ha già di serie dei renderer predefiniti per vari tipi tra cui Object e Number. Se registri un renderer di default per Object (sostituendo quindi quello di serie), funziona per valori String (perché non ce n'é uno di serie per String) ma non per valori Integer (perché prende il renderer di serie per Number).