Why are ethereum addresses hashes of public keys?

Externally owned accounts: No issue using public key directly.

Design choice for parity between externally owned and internal accounts (contracts).

Contracts are not linked to private keys, contract address is calculated from:

hash of creating address, transaction nonce.

Naive case: replace with hash of public key and nonce, in the case where a contract is created from another contract, there is not public key.