diff git a/libraries/base/Control/Monad/Fail.hs b/libraries/base/Control/Monad/Fail.hs
 a/libraries/base/Control/Monad/Fail.hs
+++ b/libraries/base/Control/Monad/Fail.hs
@@ 49,7 +49,11 @@
 with pattern that always match, such as newtypes, tuples, data types with
 only a single data constructor, and irrefutable patterns (@~pat@).

 Instances of 'MonadFail' should satisfy the following law: @fail s@ should
+ Instances of 'MonadFail' should satisfy the following laws:
+
+ @fail s@ should not cause an exception to be raised from "pure" code.
+
+ @fail s@ should
 be a left zero for '>>=',

 @
diff git a/libraries/base/Control/Monad/ST/Lazy/Imp.hs b/libraries/base/Control/Monad/ST/Lazy/Imp.hs
 a/libraries/base/Control/Monad/ST/Lazy/Imp.hs
+++ b/libraries/base/Control/Monad/ST/Lazy/Imp.hs
@@ 44,7 +44,6 @@
import qualified GHC.ST as GHC.ST
import GHC.Base
import qualified Control.Monad.Fail as Fail
  The lazy statetransformer monad.
 A computation of type @'ST' s a@ transforms an internal state indexed
@@ 181,8 +180,6 @@
  @since 2.01
instance Monad (ST s) where
 fail s = errorWithoutStackTrace s

(>>) = (*>)
m >>= k = ST $ \ s >
@@ 194,9 +191,8 @@
in
unST (k r) new_s
  @since 4.10
instance Fail.MonadFail (ST s) where
 fail s = errorWithoutStackTrace s
+ Note: A MonadFail instance was once added by mistake. We
+ should not do that again!
  Return the value computed by a state transformer computation.
 The @forall@ ensures that the internal state used by the 'ST'
diff git a/libraries/base/GHC/ST.hs b/libraries/base/GHC/ST.hs
 a/libraries/base/GHC/ST.hs
+++ b/libraries/base/GHC/ST.hs
@@ 26,7 +26,6 @@
import GHC.Base
import GHC.Show
import qualified Control.Monad.Fail as Fail
default ()
@@ 78,9 +77,8 @@
case (k r) of { ST k2 >
(k2 new_s) }})
  @since 4.11.0.0
instance Fail.MonadFail (ST s) where
 fail s = errorWithoutStackTrace s
+ Note: An instance for MonadFail was mistakenly added. We should
+ not do that again!
  @since 4.11.0.0
instance Semigroup a => Semigroup (ST s a) where