Comparando o objeto primitivo com o wrapper com o comportamento == inexplicável

Eu tenho um pedaço de código que eu preciso 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);
}

Resultado:

true
true
false

Não consigo entender por que apenas a terceira declaração está falhando.

EDIT: Esta pergunta é diferente da.equals vs== pergunta como esta sobre comparação primitiva versus comparação de objetos.

questionAnswers(4)

yourAnswerToTheQuestion