The space of addresses is completely separate from that of transaction and block hashes, so you should be able to detect addresses very reliably – they will almost certainly contain some non-hexadecimal characters and will be not be 64 character long.
As for distinguishing between blocks and transactions, MultiChain by default starts block hashes with 00, so that's a good heuristic. But 1 in 256 transactions (on average) will also start with this prefix. So your safest bet is just to try the hash as a block first with getblock, then fall back on a transaction – this is also very efficient.