diff --git a/Changes.md b/Changes.md
new file mode 100644
--- /dev/null
+++ b/Changes.md
@@ -0,0 +1,17 @@
+# Change log for the `probability` package
+
+## 0.2.6
+
+ * `instance Monad Distribution.T`:
+   Remove definition of `fail`.
+   This turns calls to `fail` into `error`s
+   for GHCs prior to the "Monad Fail Proposal".
+   Formerly it was an empty list,
+   but this was bad since the probabilities in an empty list
+   sum up to zero not one, thus breaking the invariant.
+   Beginning with GHC-8.8 and the "Monad Fail Proposal"
+   you can no longer accidentally call `fail`,
+   since `Distribution.T` is not an instance of `MonadFail`.
+
+ * `instance Monad Probability.EitherT`:
+   Define `MonadFail` instance for GHC>=8.8.1.
diff --git a/probability.cabal b/probability.cabal
--- a/probability.cabal
+++ b/probability.cabal
@@ -1,5 +1,5 @@
 Name:               probability
-Version:            0.2.5.2
+Version:            0.2.6
 License:            BSD3
 License-File:       COPYRIGHT
 Author:             Martin Erwig <erwig@eecs.oregonstate.edu>, Steve Kollmansberger
@@ -17,6 +17,8 @@
 Tested-With:    GHC==7.0.2, GHC==7.2.2, GHC==7.4.2, GHC==7.8.2
 Cabal-Version:  >=1.6
 Build-Type:     Simple
+Extra-Source-Files:
+  Changes.md
 Data-Files:
   README
   ToDo
@@ -28,7 +30,7 @@
 Source-Repository this
   type:     darcs
   location: http://code.haskell.org/~thielema/probability/
-  tag:      0.2.5.2
+  tag:      0.2.6
 
 
 Flag splitBase
@@ -43,6 +45,10 @@
       containers >=0.1 && <0.7,
       random >=1.0 && <2,
       base >=2 && <5
+    If impl(ghc>=8.8)
+      Hs-Source-Dirs: src-fail/from-4.13/
+    Else
+      Hs-Source-Dirs: src-fail/before-4.13/
   Else
     Build-Depends:
       special-functors >=1.0 && <1.1,
diff --git a/src-fail/before-4.13/Numeric/Probability/Either.hs b/src-fail/before-4.13/Numeric/Probability/Either.hs
new file mode 100644
--- /dev/null
+++ b/src-fail/before-4.13/Numeric/Probability/Either.hs
@@ -0,0 +1,37 @@
+module Numeric.Probability.Either where
+
+import Control.Monad.Instances ()
+
+import Control.Applicative (Applicative, pure, (<*>), liftA2, )
+
+
+newtype EitherT a m b = EitherT (m (Either a b))
+
+instance Functor m => Functor (EitherT a m) where
+   fmap f (EitherT m) = EitherT $ fmap (fmap f) m
+
+instance Applicative m => Applicative (EitherT a m) where
+   pure a = EitherT $ pure $ Right a
+   EitherT af <*> EitherT am =
+      EitherT $
+      liftA2 (\ef em ->
+         case ef of
+            Left b -> Left b
+            Right f ->
+               case em of
+                  Left b -> Left b
+                  Right m -> Right $ f m) af am
+
+instance Monad m => Monad (EitherT a m) where
+   return a = EitherT $ return $ Right a
+   EitherT m >>= f  =  EitherT $ do
+      e <- m
+      case e of
+         Left b -> return $ Left b
+         Right a ->
+            case f a of
+               EitherT n -> n
+   fail s = EitherT $ fail s
+
+throw :: Applicative m => a -> EitherT a m b
+throw a = EitherT $ pure $ Left a
diff --git a/src-fail/from-4.13/Numeric/Probability/Either.hs b/src-fail/from-4.13/Numeric/Probability/Either.hs
new file mode 100644
--- /dev/null
+++ b/src-fail/from-4.13/Numeric/Probability/Either.hs
@@ -0,0 +1,39 @@
+module Numeric.Probability.Either where
+
+import Control.Monad.Instances ()
+
+import Control.Applicative (Applicative, pure, (<*>), liftA2, )
+
+
+newtype EitherT a m b = EitherT (m (Either a b))
+
+instance Functor m => Functor (EitherT a m) where
+   fmap f (EitherT m) = EitherT $ fmap (fmap f) m
+
+instance Applicative m => Applicative (EitherT a m) where
+   pure a = EitherT $ pure $ Right a
+   EitherT af <*> EitherT am =
+      EitherT $
+      liftA2 (\ef em ->
+         case ef of
+            Left b -> Left b
+            Right f ->
+               case em of
+                  Left b -> Left b
+                  Right m -> Right $ f m) af am
+
+instance Monad m => Monad (EitherT a m) where
+   return a = EitherT $ return $ Right a
+   EitherT m >>= f  =  EitherT $ do
+      e <- m
+      case e of
+         Left b -> return $ Left b
+         Right a ->
+            case f a of
+               EitherT n -> n
+
+instance MonadFail m => MonadFail (EitherT a m) where
+   fail s = EitherT $ fail s
+
+throw :: Applicative m => a -> EitherT a m b
+throw a = EitherT $ pure $ Left a
diff --git a/src/Numeric/Probability/Distribution.hs b/src/Numeric/Probability/Distribution.hs
--- a/src/Numeric/Probability/Distribution.hs
+++ b/src/Numeric/Probability/Distribution.hs
@@ -64,7 +64,6 @@
 instance Num prob => Monad (T prob) where
   return   = certainly
   d >>= f  = Cons [(y,q*p) | (x,p) <- decons d, (y,q) <- decons (f x)]
-  fail _   = Cons []
 
 instance Num prob => Applicative (T prob) where
   pure     = certainly
diff --git a/src/Numeric/Probability/Either.hs b/src/Numeric/Probability/Either.hs
deleted file mode 100644
--- a/src/Numeric/Probability/Either.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-module Numeric.Probability.Either where
-
-import Control.Monad.Instances ()
-
-import Control.Applicative (Applicative, pure, (<*>), liftA2, )
-
-
-newtype EitherT a m b = EitherT (m (Either a b))
-
-instance Functor m => Functor (EitherT a m) where
-   fmap f (EitherT m) = EitherT $ fmap (fmap f) m
-
-instance Applicative m => Applicative (EitherT a m) where
-   pure a = EitherT $ pure $ Right a
-   EitherT af <*> EitherT am =
-      EitherT $
-      liftA2 (\ef em ->
-         case ef of
-            Left b -> Left b
-            Right f ->
-               case em of
-                  Left b -> Left b
-                  Right m -> Right $ f m) af am
-
-instance Monad m => Monad (EitherT a m) where
-   return a = EitherT $ return $ Right a
-   EitherT m >>= f  =  EitherT $ do
-      e <- m
-      case e of
-         Left b -> return $ Left b
-         Right a ->
-            case f a of
-               EitherT n -> n
-   fail s = EitherT $ fail s
-
-throw :: Applicative m => a -> EitherT a m b
-throw a = EitherT $ pure $ Left a
