"up" is very broad term. E.g. it may respond to ping, but actually have no free disk space, or all queries are blocked or crashing every second and automatically restarting, or all tables are actually marked as crashed or even worse - dropped or datadir got unmounted from the system etc.
Or it can be swapping like crazy and CPU is abused by several queries, so it can hardly crawl, so it is not "up" for sure.
Or e.g. it may fail to respond to ping e.g. because of connection limit, but your applications use persistent connection and work perfectly.
Or e.g. it may fail to respond to ping e.g. because of some client problem on localhost, but again - all applications do not actually experience any issue.
So, sometimes 'ping' is valid answer, but you need always consider these cases while thinking about "monitor whether server is up".