According to the documentation on the Solidity ABI:
address: equivalent to uint160, except for the assumed interpretation and language typing
The Solidity documentation carries on to say:
address: Holds a 20 byte value (size of an Ethereum address). Address types also have members and serve as a base for all contracts.
You should note firstly that the address type serves as a base for all contracts, in fact contracts inherit some members and functions from the address type. As such, when one initializes an address variable, it is possible to query the account at said address in the following ways, as stated in the documentation (here & here).
<address>.balance (uint256): balance of the Address in Wei
<address>.transfer(uint256 amount): send given amount of Wei to Address, throws on failure
<address>.send(uint256 amount) returns (bool): send given amount of Wei to Address, returns false on failure
<address>.call(...) returns (bool): issue low-level CALL, returns false on failure
<address>.callcode(...) returns (bool): issue low-level CALLCODE, returns false on failure
<address>.delegatecall(...) returns (bool): issue low-level DELEGATECALL, returns false on failure
The advantage of using an
address variable instead of a
uint160 is therefore the advantage it gives when querying or interacting with accounts (externally owned or contract accounts).
Using the address type also serves to improve readability, in that it tells the reader of the contract that the value stored relates to a contract address.
NOTE: As of version 5.0.0 of Solidity, members of the address type will no longer be available to contract types - you will need to explicitly cast to the address type first in order to use them.