Comparar primitivo con objeto contenedor con == comportamiento inexplicable

Tengo un código que necesito entender:

public static void main(String[] args) {
    Character c = new Character('a');
    Character cy = new Character('a');
    char cx = 'a';

    System.out.println(c == cx);
    System.out.println(cx == cy);
    System.out.println(c == cy);
}

Salida:

true
true
false

No puedo entender por qué solo falla la tercera declaración.

EDITAR: Esta pregunta es diferente a la.equals vs== pregunta como esta sobre la comparación primitiva versus la comparación de objetos.

Respuestas a la pregunta(4)

Su respuesta a la pregunta