Hola David, la separación del código en clases la estás planteando por el buen camino, todavía tendrás que ir mejorando pero en general el diseño separado en clases te sirve para manejar los conceptos de la programación orientada a objetos. Te comento algunos detalles a mejorar:
Incoherencia: tener un atributo en la clase ListaCantantesFamosos denominado nombreDeCantante. Ese atributo debería llamarse nombreDeLaLista.
private String nombreDeCantante; // Establecemos atributo nombre de la lista.
Preferible no usar eñes en nombres de atributos, clases o métodos. Por eso es mejor addDatos que añadeDatos
Los métodos en general deben ser public y no void, por ejemplo:
Mal: static void solicitudDeDatos(int veces,String tipoDeDatos)
Bien: public void solicitudDeDatos(int veces,String tipoDeDatos)
De este modo, para invocar un método antes tienes que crear un objeto usando new (no podrás hacerlo invocando directamente VisualizadorDeMensajes.solicitudDeDatos(...) ). ¡En la programación orientada a objetos se trabaja creando objetos, solo en algunas circunstancias especiales no se hace así!
En un bucle el incremento de la variable del bucle no se suele escribir como numeroDeDatos = numeroDeDatos + 1 sino como numeroDeDatos++
Saludos