It is unclear to me why MonadMaskingState is separate from MonadMask. Is there some good reason?
It is a bit inconvenient, when one is already using MonadMask and then wanting to use one of the other masking-related functions and having to propagate a new class constraint everywhere.
And related: why does MonadEvaluate inherit from MonadThrow? I can't see how they are related.