diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,16 +1,23 @@
+## 0.2.3 [2018.08.01]
+---------------------
+* Add `MonadFail` instances for `ReadingRCU` and `WritingRCU`.
+
 ## 0.2.2 [2018.02.06]
 ---------------------
 * Include `HLint.hs` with the tarball distribution, fixing the `hlint`
   test suite.
 
 ## 0.2.1
+--------
 * Support `doctest-0.12`
 
 ## 0.2
+------
 * Revamp `Setup.hs` to use `cabal-doctest`. This makes it build
   with `Cabal-2.0`, and makes the `doctest`s work with `cabal new-build` and
   sandboxes.
 
 ## 0
+----
 * Initial version
 
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -2,7 +2,7 @@
 
 [![Hackage](https://img.shields.io/hackage/v/rcu.svg)](https://hackage.haskell.org/package/rcu) [![Build Status](https://secure.travis-ci.org/ekmett/rcu.png?branch=master)](http://travis-ci.org/ekmett/rcu)
 
-This package is an exploration of Read-Copy Update in Haskell based on [Relativistic Programming in Haskell](http://web.cecs.pdx.edu/~walpole/papers/haskell2015.pdf) by Cooper and Walpole.  It includes a sound QSBR-based implementation and an attempt at an STM-based implementation.
+This package is an exploration of Read-Copy Update in Haskell based on [Relativistic Programming in Haskell](http://web.cecs.pdx.edu/~theod/papers/haskell2015.pdf) by Cooper and Walpole.  It includes a sound QSBR-based implementation and an attempt at an STM-based implementation.
 
 In the spirit of [A Relativistic Enhancement to Software Transactional Memory](https://www.usenix.org/legacy/events/hotpar11/tech/final_files/Howard.pdf)
  by Howard and Walpole, we could extend the STM implementation to allow reads and writes on the same data in parallel, writes to disjoint data in parallel, and force readers to agree that writes before a `synchronize` happened before writes after it.
diff --git a/rcu.cabal b/rcu.cabal
--- a/rcu.cabal
+++ b/rcu.cabal
@@ -1,6 +1,6 @@
 name:          rcu
 category:      Data
-version:       0.2.2
+version:       0.2.3
 license:       BSD3
 cabal-version: >= 1.22
 license-file:  LICENSE
@@ -11,7 +11,11 @@
 bug-reports:   http://github.com/ekmett/rcu/issues
 copyright:     Copyright (C) 2015 Edward A. Kmett, Theodore Rhys Cooper
 build-type:    Custom
-tested-with:   GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1
+tested-with:   GHC == 7.10.3
+             , GHC == 8.0.2
+             , GHC == 8.2.2
+             , GHC == 8.4.3
+             , GHC == 8.6.1
 synopsis:      Read-Copy-Update for Haskell
 description:   Read-Copy-Update for Haskell.
 
@@ -57,6 +61,7 @@
   build-depends:
     atomic-primops >= 0.8,
     base >= 4.8 && < 5,
+    fail == 4.9.*,
     ghc-prim >= 0.3,
     parallel >= 3.2 && < 3.3,
     primitive >= 0.6,
@@ -80,7 +85,7 @@
 
   if flag(unstable)
     hs-source-dirs: unstable
-    build-depends: stm >= 2.4.4 && < 2.5
+    build-depends: stm >= 2.4.4 && < 2.6
     exposed-modules:
       Control.Concurrent.RCU.STM
       Control.Concurrent.RCU.STM.Internal
@@ -463,7 +468,7 @@
   else
     build-depends:
       base >= 4.8,
-      doctest >= 0.11.1 && < 0.14,
+      doctest >= 0.11.1 && < 0.17,
       parallel,
       rcu
 
diff --git a/src/Control/Concurrent/RCU/GC/Internal.hs b/src/Control/Concurrent/RCU/GC/Internal.hs
--- a/src/Control/Concurrent/RCU/GC/Internal.hs
+++ b/src/Control/Concurrent/RCU/GC/Internal.hs
@@ -52,7 +52,7 @@
 import Data.Primitive
 import Prelude hiding (Read(..))
 import System.Mem
-
+import qualified Control.Monad.Fail as Fail
 
 --------------------------------------------------------------------------------
 -- * Shared References
@@ -140,8 +140,11 @@
   ReadingRCU m >>= f = ReadingRCU $ \ s -> do
     a <- m s
     runReadingRCU (f a) s
-  fail s = ReadingRCU $ \ _ -> fail s
+  fail = Fail.fail
 
+instance Fail.MonadFail (ReadingRCU s) where
+  fail s = ReadingRCU $ \ _ -> Fail.fail s
+
 instance Alternative (ReadingRCU s) where
   empty = ReadingRCU $ \ _ -> empty
   ReadingRCU ma <|> ReadingRCU mb = ReadingRCU $ \s -> ma s <|> mb s
@@ -174,7 +177,10 @@
   WritingRCU m >>= f = WritingRCU $ \ s -> do
     a <- m s
     runWritingRCU (f a) s
-  fail s = WritingRCU $ \ _ -> fail s
+  fail = Fail.fail
+
+instance Fail.MonadFail (WritingRCU s) where
+  fail s = WritingRCU $ \ _ -> Fail.fail s
 
 instance Alternative (WritingRCU s) where
   empty = WritingRCU $ \ _ -> empty
diff --git a/src/Control/Concurrent/RCU/QSBR/Internal.hs b/src/Control/Concurrent/RCU/QSBR/Internal.hs
--- a/src/Control/Concurrent/RCU/QSBR/Internal.hs
+++ b/src/Control/Concurrent/RCU/QSBR/Internal.hs
@@ -53,6 +53,7 @@
 import Data.List
 import Data.Primitive
 import Foreign
+import qualified Control.Monad.Fail as Fail
 
 import Prelude hiding (Read(..))
 
@@ -149,8 +150,11 @@
   ReadingRCU m >>= f = ReadingRCU $ \ s -> do
     a <- m s
     runReadingRCU (f a) s
-  fail s = ReadingRCU $ \ _ -> fail s
+  fail = Fail.fail
 
+instance Fail.MonadFail (ReadingRCU s) where
+  fail s = ReadingRCU $ \ _ -> Fail.fail s
+
 instance Alternative (ReadingRCU s) where
   empty = ReadingRCU $ \ _ -> empty
   ReadingRCU ma <|> ReadingRCU mb = ReadingRCU $ \s -> ma s <|> mb s
@@ -183,7 +187,10 @@
   WritingRCU m >>= f = WritingRCU $ \ s -> do
     a <- m s
     runWritingRCU (f a) s
-  fail s = WritingRCU $ \ _ -> fail s
+  fail = Fail.fail
+
+instance Fail.MonadFail (WritingRCU s) where
+  fail s = WritingRCU $ \ _ -> Fail.fail s
 
 instance Alternative (WritingRCU s) where
   empty = WritingRCU $ \ _ -> empty
diff --git a/unstable/Control/Concurrent/RCU/STM/Internal.hs b/unstable/Control/Concurrent/RCU/STM/Internal.hs
--- a/unstable/Control/Concurrent/RCU/STM/Internal.hs
+++ b/unstable/Control/Concurrent/RCU/STM/Internal.hs
@@ -38,6 +38,7 @@
 import Data.Coerce
 import Data.Int
 import Prelude hiding (read, Read)
+import qualified Control.Monad.Fail as Fail
 
 --------------------------------------------------------------------------------
 -- * Shared References
@@ -52,7 +53,8 @@
 --------------------------------------------------------------------------------
 
 -- | This is the basic read-side critical section for an RCU computation
-newtype ReadingRCU s a = ReadingRCU { runReadingRCU :: IO a } deriving (Functor, Applicative, Monad)
+newtype ReadingRCU s a = ReadingRCU { runReadingRCU :: IO a }
+  deriving (Functor, Applicative, Monad, Fail.MonadFail)
 
 instance MonadNew (SRef s) (ReadingRCU s) where
   newSRef = r where
@@ -82,6 +84,9 @@
   WritingRCU m >>= f = WritingRCU $ \ c -> do
     a <- m c
     runWritingRCU (f a) c
+  fail = Fail.fail
+
+instance Fail.MonadFail (WritingRCU s) where
   fail s = WritingRCU $ \ _ -> fail s
 
 instance Alternative (WritingRCU s) where
