Existem muitas formas de pensar neste problema, e no fim, não existe a melhor escolha. Tudo depende do que vc quer fazer com essas classes.
Tomando uma prespetiva estritamente orientada a objetos e tendo em conta que eles devem traduzir a realidade então uma pessoa fisica (individuo) e uma pessoa juridica ( empresa , etc…) não são a mesma coisa.
O individuo pode ser uma pessoa física , mas pode não ser. O que faz com que ele seja ? Se ele tem uma identificação tributária (cpf) ele é uma pessoa física. “Pessoa Fisica” é na realidade um conceito legal e não um conceito real (do mundo real dos objetos fisicos e palpáveis) . Pessoa Fisica é na realidade uma interface. É um conjunto de propriedades/acções que o sistema fiscal/legal espera do individuo. Analogamente da empresa.
A representação ficaria assim
IdentificadorFiscal (abstracto ou interface)
CPF extends IdentificadorFiscal
CNPJ extends IdentificadorFiscal
(ou IdentificadorFiscal seja genérico de forma a suportar ambos)
EntidadeFiscal (interface)
IdentificadorFiscal getIdentificadorFiscal ()
Individuo extends Pessoa implements EntidadeFiscal
Empresa extends Pessoa implements EntidadeFiscal
Pessoa
getName()
getBirthDay()
Empresa
getLegalName() // nome verdadeiro da empresa , getName seria o nome fantasia
Esta é uma possibilidade.