diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -21,6 +21,7 @@
   )
 
 import Control.Concurrent.Classy hiding (catch)
+import Control.Monad.Fail
 import Control.Monad.Catch
 import Control.Monad.Trans.Class
 
@@ -90,7 +91,7 @@
   }
 
 newtype RaftExampleM sm v a = RaftExampleM { unRaftExampleM :: ReaderT (NodeEnv sm) (RaftSocketT v (RaftFileStoreT IO)) a }
-  deriving (Functor, Applicative, Monad, MonadIO, MonadReader (NodeEnv sm), Alternative, MonadPlus)
+  deriving (Functor, Applicative, Monad, MonadIO, MonadFail, MonadReader (NodeEnv sm), Alternative, MonadPlus)
 
 deriving instance MonadThrow (RaftExampleM sm v)
 deriving instance MonadCatch (RaftExampleM sm v)
diff --git a/libraft.cabal b/libraft.cabal
--- a/libraft.cabal
+++ b/libraft.cabal
@@ -2,13 +2,11 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b32be6507cfec629f59764cb08eca1bc86e11f5e67036477ae0aaa54e6b1458c
+-- hash: 0e9cecc332c8c5b872a193fa8e1bcf55c994bce6217b0d17f13894079c45af32
 
 name:           libraft
-version:        0.1.0.0
-synopsis:       Raft consensus algorithm
+version:        0.1.1.0
 description:    Please see the README on GitHub at <https://github.com/adjoint-io/raft#readme>
-category:       Distributed Systems
 homepage:       https://github.com/adjoint-io/raft#readme
 bug-reports:    https://github.com/adjoint-io/raft/issues
 author:         Adjoint Inc.
diff --git a/src/Examples/Raft/FileStore.hs b/src/Examples/Raft/FileStore.hs
--- a/src/Examples/Raft/FileStore.hs
+++ b/src/Examples/Raft/FileStore.hs
@@ -16,6 +16,7 @@
 import Protolude
 
 import Control.Concurrent.Classy hiding (catch, ThreadId)
+import Control.Monad.Fail
 import Control.Monad.Catch
 import Control.Monad.Trans.Class
 
@@ -37,7 +38,7 @@
   }
 
 newtype RaftFileStoreT m a = RaftFileStoreT { unRaftFileStoreT :: ReaderT NodeFileStoreEnv m a }
-  deriving (Functor, Applicative, Monad, MonadIO, MonadReader NodeFileStoreEnv, Alternative, MonadPlus, MonadTrans)
+  deriving (Functor, Applicative, Monad, MonadIO, MonadFail, MonadReader NodeFileStoreEnv, Alternative, MonadPlus, MonadTrans)
 
 deriving instance MonadConc m => MonadThrow (RaftFileStoreT m)
 deriving instance MonadConc m => MonadCatch (RaftFileStoreT m)
diff --git a/src/Examples/Raft/Socket/Node.hs b/src/Examples/Raft/Socket/Node.hs
--- a/src/Examples/Raft/Socket/Node.hs
+++ b/src/Examples/Raft/Socket/Node.hs
@@ -21,6 +21,7 @@
   )
 
 import Control.Concurrent.Classy hiding (catch, ThreadId)
+import Control.Monad.Fail
 import Control.Monad.Catch
 import Control.Monad.Trans.Class
 
@@ -45,7 +46,7 @@
   }
 
 newtype RaftSocketT v m a = RaftSocketT { unRaftSocketT :: ReaderT (NodeSocketEnv v) m a }
-  deriving (Functor, Applicative, Monad, MonadIO, MonadReader (NodeSocketEnv v), Alternative, MonadPlus, MonadTrans)
+  deriving (Functor, Applicative, Monad, MonadIO, MonadFail, MonadReader (NodeSocketEnv v), Alternative, MonadPlus, MonadTrans)
 
 deriving instance MonadConc m => MonadThrow (RaftSocketT v m)
 deriving instance MonadConc m => MonadCatch (RaftSocketT v m)
diff --git a/src/Raft.hs b/src/Raft.hs
--- a/src/Raft.hs
+++ b/src/Raft.hs
@@ -110,6 +110,7 @@
 import Control.Concurrent.Classy.STM.TChan
 import Control.Concurrent.Classy.Async
 
+import Control.Monad.Fail
 import Control.Monad.Catch
 import Control.Monad.Trans.Class
 
@@ -144,7 +145,7 @@
 
 newtype RaftT v m a = RaftT
   { unRaftT :: ReaderT (RaftEnv v m) (StateT RaftNodeState m) a
-  } deriving (Functor, Applicative, Monad, MonadReader (RaftEnv v m), MonadState RaftNodeState, Alternative, MonadPlus)
+  } deriving (Functor, Applicative, Monad, MonadReader (RaftEnv v m), MonadState RaftNodeState, MonadFail, Alternative, MonadPlus)
 
 instance MonadTrans (RaftT v) where
   lift = RaftT . lift . lift
@@ -182,7 +183,7 @@
 -- It should run forever
 runRaftNode
   :: ( Show v, Show sm, Show (Action sm v)
-     , MonadIO m, MonadConc m
+     , MonadIO m, MonadConc m, MonadFail m
      , RSM sm v m
      , Show (RSMPError sm v)
      , RaftSendRPC m v
@@ -223,7 +224,7 @@
 handleEventLoop
   :: forall sm v m.
      ( Show v, Show sm, Show (Action sm v)
-     , MonadIO m, MonadConc m
+     , MonadIO m, MonadConc m, MonadFail m
      , RSM sm v m
      , Show (RSMPError sm v)
      , RaftPersist m
diff --git a/src/Raft/Leader.hs b/src/Raft/Leader.hs
--- a/src/Raft/Leader.hs
+++ b/src/Raft/Leader.hs
@@ -5,8 +5,6 @@
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE GADTs #-}
-{-# LANGUAGE MonoLocalBinds #-}
-{-# LANGUAGE RankNTypes #-}
 
 module Raft.Leader (
     handleAppendEntries
diff --git a/test/TestDejaFu.hs b/test/TestDejaFu.hs
--- a/test/TestDejaFu.hs
+++ b/test/TestDejaFu.hs
@@ -20,6 +20,7 @@
 import qualified Data.Serialize as S
 import Numeric.Natural
 
+import Control.Monad.Fail
 import Control.Monad.Catch
 import Control.Monad.Conc.Class
 import Control.Concurrent.Classy.STM.TChan
@@ -86,7 +87,7 @@
 
 newtype RaftTestM a = RaftTestM {
     unRaftTestM :: ReaderT TestNodeEnv (StateT TestNodeStates ConcIO) a
-  } deriving (Functor, Applicative, Monad, MonadIO, MonadReader TestNodeEnv, MonadState TestNodeStates)
+  } deriving (Functor, Applicative, Monad, MonadIO, MonadReader TestNodeEnv, MonadState TestNodeStates, MonadFail)
 
 deriving instance MonadThrow RaftTestM
 deriving instance MonadCatch RaftTestM
