Apenas meus 2 centavos na questão de por que a semântica da visibilidade privada em Java é nível de classe em vez de nível de objeto.
Eu diria que a conveniência parece ser a chave aqui. Na verdade, uma visibilidade privada no nível do objeto teria forçado a expor métodos para outras classes (por exemplo, no mesmo pacote) no cenário ilustrado pelo OP.
Na verdade, não fui capaz de inventar nem encontrar um exemplo que mostrasse que a visibilidade no nível privado da classe (como o oferecido pelo Java) cria problemas se comparada à visibilidade no nível privado do objeto.
Dito isso, as linguagens de programação com um sistema mais refinado de políticas de visibilidade podem permitir a visibilidade do objeto no nível do objeto e no nível da classe.
Por exemplo , Eiffel oferece exportação seletiva: você pode exportar qualquer recurso de classe para qualquer classe de sua escolha, de {NENHUM} (objeto-privado) para {QUALQUER} (o equivalente a público, e também o padrão), para {PESSOA} (classe privada, veja o exemplo do OP), para grupos específicos de classes {PESSOA, BANCO}.
Também é interessante observar que em Eiffel você não precisa tornar um atributo privado e escrever um getter para evitar que outras classes atribuam a ele. Atributos públicos em Eiffel são por padrão acessíveis no modo somente leitura, então você não precisa de um getter apenas para retornar seu valor.
É claro que você ainda precisa de um setter para definir um atributo, mas pode ocultá-lo definindo-o como "atribuidor" para esse atributo. Isso permite que você, se desejar, use o operador de atribuição mais conveniente em vez da invocação do setter.