Since all ERC20 tokens share the same set of functions, they can all be interacted with in the same ways.
If you build an application that is capable of interacting with one ERC20 token, it's also capable of interacting with any ERC20 token without any additional work to do (except plugging in another ERC20 token contract address).
In practice - when an exchange adds a new ERC20 token, really it just needs to add another smart contract it talks to. For the exchange example it means the transfers logic needs to be implemented once.
ERC20 tokens are a go-to solution for currency-like usage. But they're not particularly useful for representing the objects, for example:
Collectible isn't divisible like currency — transfering you 0.237 of a collectible doesn't make sense. Collectibles don't necesarrily have to be equal (their internal state may differ, they may have different parameters and rarity.
For collectibles a go-to solution is to use ERC721 standard.