Só para esclarecer melhor.
Digamos que você tenha a seguinte hierarquia:
java.lang.Object <-- java.lang.Number <-- java.lang.Integer
Como você deve saber, java.lang.Number é uma classe abstrata, e java.lang.Integer é uma classe concreta que estende essa classe abstrata.
Você pode referenciar um objeto da classe java.lang.Integer (uma classe concreta) de três maneiras (veja que não preciso fazer cast nenhum) :
Object obj = new Integer(111);
Number num = new Integer(222);
Integer intg = new Integer (333);
Nos três casos, as variáveis acima referenciam objetos da classe concreta Integer, mas são variáveis de tipos diferentes.
No caso de obj, você pode chamar os métodos toString(), hashcode() e equals().
No caso de num, além dos métodos de Object listados acima, você pode chamar os métodos intValue(), doubleValue() etc. (veja o javadoc da classe Number)
No caso de intg, não há métodos novos definidos (na verdade, há uma pancada de métodos estáticos que são exclusivos de java.lang.Integer, mas eles não vêm ao caso nessa explicação).
Portanto, o uso de variáveis com tipos diferentes não altera o tipo do objeto referenciado. Só os métodos que podem ser chamados é que variam - você pode chamar menos ou mais métodos dependendo do tipo da variável.