Olá Rafael, tudo bem com você?
A classe Double é uma representação de um número de ponto flutuante do tipo primitivo double, trazendo as facilidades que uma classe traz: ter métodos, criar estruturas de dados com Generics, etc.
Ao utilizar o valor da variável ref dentro de um System.out.println(), a JVM é inteligente o suficiente para usar o valor que o objeto do tipo Double guarda, nesse caso 3.2, através do unboxing automático. No entanto, o Java ainda trata essa variável como uma referência para um objeto do tipo Double. Ao utilizar o método doubleValue(), é retornado um número no tipo primitivo double, e não mais um objeto do tipo Double, ou seja, não é possível utilizar métodos da classe Double, nem criar listas com o retorno desse método. 
Sendo assim, a diferença se dá muito mais com o objetivo que se tenta alcançar com o uso da variável: caso eu precise criar uma Lista ou outra estrutura de dados para guardar valores do tipo double, só é possível com a classe Double. Caso seja necessário apenas o valor double, pode se utilizar tanto uma variável double ou o doubleValue() (a variável do tipo primitivo double ocupa menos espaço na memória).
Em geral, sempre faz sentido utilizar o doubleValue() quando você precisa apenas do valor double do objeto e não vai realizar nenhuma manipulação possível apenas a partir dos métodos da classe Double.
Fico à disposição em caso de dúvidas.
Um grande abraço e bons estudos.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!