Solo mis dos centavos sobre la cuestión de por qué la semántica de la visibilidad privada en Java es a nivel de clase en lugar de a nivel de objeto.
Diría que la comodidad parece ser la clave aquí. De hecho, una visibilidad privada a nivel de objeto habría obligado a exponer métodos a otras clases (por ejemplo, en el mismo paquete) en el escenario ilustrado por el OP.
En verdad, no pude ni inventar ni encontrar un ejemplo que muestre que la visibilidad a nivel de clase privada (como la que ofrece Java) crea problemas si se compara con la visibilidad a nivel de objeto privado.
Dicho esto, los lenguajes de programación con un sistema más detallado de políticas de visibilidad pueden permitir tanto la visibilidad de objetos a nivel de objeto como a nivel de clase.
Por ejemplo , Eiffel ofrece exportación selectiva: puede exportar cualquier elemento de clase a cualquier clase de su elección, desde {NINGUNO} (objeto privado) a {CUALQUIER} (el equivalente de público, y también el predeterminado), a {PERSON} (class-private, vea el ejemplo de OP), a grupos específicos de clases {PERSON, BANK}.
También es interesante señalar que en Eiffel no es necesario hacer que un atributo sea privado y escribir un captador para evitar que otras clases le asignen. Los atributos públicos en Eiffel son accesibles por defecto en modo de solo lectura, por lo que no necesita un captador solo para devolver su valor.
Por supuesto, todavía necesita un establecedor para establecer un atributo, pero puede ocultarlo definiéndolo como "asignador" para ese atributo. Esto le permite, si lo desea, utilizar el operador de asignación más conveniente en lugar de la invocación del establecedor.