¿Por qué cambia el comportamiento de la agrupación constante de enteros en 127?

No puedo entender cómo funciona Java Constant Pool for Integer.

Entiendo el comportamiento de las cadenas y, por lo tanto, soy capaz de justificarme a mi mismo que es el mismo caso con las constantes enteras también.

Entonces, para los enteros

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2); // True

&

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1==i2); // False

Hasta aquí todo va en mi cabeza.

Lo que no puedo digerir es que se comporta de manera diferente cuando aumente el entero de 127. Este comportamiento cambia después de 127, a continuación se muestra el fragmento de código

Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1==i2); // False. WHY?????

¿Puede alguien ayudarme a entender esto?