The documentation for Control.Monad.Fail notes

> If your Monad is also MonadPlus, a popular definition is
>> fail _ = mzero

This could be made a default definition for MonadPlus or Alternative

> class Monad m => MonadFail m where
>   fail :: String -> m a
>   fail = const empty
>   default fail :: Alternative m => String -> m a

This simplifies instances like [] and Maybe

> instance MonadFail []
> instance MonadFail Maybe