Using timer2's ISR instead of timer1's in Arduino wiring.c breaks Serial object
Now everything works except for delay()


delay() uses micros() and micros() reads the hardware registers, like this:

unsigned long micros() {
    unsigned long m;
    uint8_t oldSREG = SREG, t;

    cli();
    m = timer0_overflow_count;
#if defined(TCNT0)
    t = TCNT0;
#elif defined(TCNT0L)
    t = TCNT0L;
#else
    #error TIMER 0 not defined
#endif

#ifdef TIFR0
    if ((TIFR0 &amp; _BV(TOV0)) &amp;&amp; (t &lt; 255))
        m++;
#else
    if ((TIFR &amp; _BV(TOV0)) &amp;&amp; (t &lt; 255))
        m++;
#endif

    SREG = oldSREG;

    return ((m &lt;&lt; 8) + t) * (64 / clockCyclesPerMicrosecond());
}


You would need to change all those references (TCNT0, TIFR0, TOV0 etc.) to use the Timer 2 equivalents.