diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+## 2.16.12
+* Derive `Typeable` instances
+
+## 2.16.5
+* Allowed building with `base-4.8.0.0`
+* Removed unneeded `Monoid` constraints on `OneT` instances
diff --git a/Language/KURE/BiTransform.hs b/Language/KURE/BiTransform.hs
--- a/Language/KURE/BiTransform.hs
+++ b/Language/KURE/BiTransform.hs
@@ -1,4 +1,6 @@
-{-# Language InstanceSigs #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE InstanceSigs #-}
 -- |
 -- Module: Language.KURE.BiTransform
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -36,6 +38,10 @@
 
 import Control.Category
 
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
+
 import Language.KURE.MonadCatch
 import Language.KURE.Transform
 import Language.KURE.Injection
@@ -46,6 +52,9 @@
 data BiTransform c m a b = BiTransform {forwardT :: Transform c m a b, -- ^ Extract the forward 'Transform' from a 'BiTransform'.
                                         backwardT :: Transform c m b a  -- ^ Extract the backward 'Transform' from a 'BiTransform'.
                                        }
+#if __GLASGOW_HASKELL__ >= 708
+  deriving Typeable
+#endif
 
 -- | A deprecated synonym for 'BiTranslate'.
 type BiTranslate c m a b = BiTransform c m a b
diff --git a/Language/KURE/Combinators/Transform.hs b/Language/KURE/Combinators/Transform.hs
--- a/Language/KURE/Combinators/Transform.hs
+++ b/Language/KURE/Combinators/Transform.hs
@@ -1,4 +1,6 @@
-{-# Language CPP, InstanceSigs #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE InstanceSigs #-}
 -- |
 -- Module: Language.KURE.Combinators.Transform
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -58,6 +60,9 @@
 
 import Data.Foldable
 import Data.Traversable
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
 
 import Language.KURE.Combinators.Arrow
 import Language.KURE.Combinators.Monad
@@ -165,11 +170,13 @@
              in go
 {-# INLINE repeatR #-}
 
--- | Attempt each trransformation until one succeeds, then return that result and discard the rest of the transformations.
+-- | Attempt each transformation until one succeeds, then return that result and discard the rest of the transformations.
 catchesT :: MonadCatch m => [Transform c m a b] -> Transform c m a b
-catchesT = foldr (<+) (fail "catchesT failed")
+catchesT = catchesM
 {-# INLINE catchesT #-}
+{-# DEPRECATED catchesT "Please use 'catchesM' instead." #-}
 
+
 -- | An identity transformation that resembles a monadic 'Control.Monad.join'.
 joinT :: Transform c m (m a) a
 joinT = contextfreeT id
@@ -205,6 +212,9 @@
 --   causes a sequence of rewrites to succeed if at least one succeeds, converting failures to
 --   identity rewrites.
 newtype AnyR m a = AnyR (m (PBool a))
+#if __GLASGOW_HASKELL__ >= 708
+  deriving Typeable
+#endif
 
 unAnyR :: AnyR m a -> m (PBool a)
 unAnyR (AnyR mba) = mba
@@ -264,6 +274,9 @@
 -- | The 'OneR' transformer, in combination with 'wrapOneR' and 'unwrapOneR',
 --   causes a sequence of rewrites to only apply the first success, converting the remainder (and failures) to identity rewrites.
 newtype OneR m a = OneR (Bool -> m (PBool a))
+#if __GLASGOW_HASKELL__ >= 708
+  deriving Typeable
+#endif
 
 unOneR :: OneR m a -> Bool -> m (PBool a)
 unOneR (OneR mba) = mba
diff --git a/Language/KURE/ExtendableContext.hs b/Language/KURE/ExtendableContext.hs
--- a/Language/KURE/ExtendableContext.hs
+++ b/Language/KURE/ExtendableContext.hs
@@ -1,4 +1,8 @@
-{-# LANGUAGE InstanceSigs, MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
 -- |
 -- Module: Language.KURE.ExtendableContext
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -21,6 +25,8 @@
         , extraContext
 ) where
 
+import Data.Typeable
+
 import Language.KURE.Path
 
 ------------------------------------------------------------------------------------------------
@@ -32,6 +38,7 @@
                              -- | Retrieve the extra contextual information.
                            , extraContext  :: e
                            }
+  deriving Typeable
 
 -- | Extend a context with some additional information.
 extendContext :: e -> c -> ExtendContext c e
diff --git a/Language/KURE/Injection.hs b/Language/KURE/Injection.hs
--- a/Language/KURE/Injection.hs
+++ b/Language/KURE/Injection.hs
@@ -1,4 +1,9 @@
-{-# LANGUAGE InstanceSigs, MultiParamTypeClasses, FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
 -- |
 -- Module: Language.KURE.Injection
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -34,6 +39,10 @@
 
 import Control.Arrow
 
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
+
 import Language.KURE.Transform
 
 -------------------------------------------------------------------------------
@@ -46,6 +55,10 @@
 class Injection a u where
   inject  :: a -> u
   project :: u -> Maybe a
+
+#if __GLASGOW_HASKELL__ >= 708
+deriving instance Typeable Injection
+#endif
 
 -- | There is an identity injection for all types.
 instance Injection a a where
diff --git a/Language/KURE/Lens.hs b/Language/KURE/Lens.hs
--- a/Language/KURE/Lens.hs
+++ b/Language/KURE/Lens.hs
@@ -1,4 +1,6 @@
-{-# Language InstanceSigs #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE InstanceSigs #-}
 -- |
 -- Module: Language.KURE.Lens
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -32,6 +34,10 @@
 import Control.Category
 import Control.Arrow
 
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
+
 import Language.KURE.MonadCatch
 import Language.KURE.Transform
 import Language.KURE.BiTransform
@@ -43,6 +49,9 @@
 -- | A 'Lens' is a way to focus on a sub-structure of type @b@ from a structure of type @a@.
 newtype Lens c m a b = Lens { -- | Convert a 'Lens' into a 'Transform' that produces a sub-structure (and its context) and an unfocussing function.
                               lensT :: Transform c m a ((c,b), b -> m a)}
+#if __GLASGOW_HASKELL__ >= 708
+  deriving Typeable
+#endif
 
 -- | The primitive way of building a 'Lens'.
 --   If the unfocussing function is applied to the value focussed on then it should succeed,
diff --git a/Language/KURE/MonadCatch.hs b/Language/KURE/MonadCatch.hs
--- a/Language/KURE/MonadCatch.hs
+++ b/Language/KURE/MonadCatch.hs
@@ -1,4 +1,7 @@
-{-# Language CPP, InstanceSigs #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE StandaloneDeriving #-}
 -- |
 -- Module: Language.KURE.MonadCatch
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -42,6 +45,7 @@
 
 import Data.Foldable
 import Data.List (isPrefixOf)
+import Data.Typeable
 
 import Language.KURE.Combinators.Monad
 
@@ -64,13 +68,17 @@
   -- | Catch a failing monadic computation.
   catchM :: m a -> (String -> m a) -> m a
 
+#if __GLASGOW_HASKELL__ >= 708
+deriving instance Typeable MonadCatch
+#endif
+
 ------------------------------------------------------------------------------------------
 
 -- | 'KureM' is the minimal structure that can be an instance of 'MonadCatch'.
 --   The KURE user is free to either use 'KureM' or provide their own monad.
 --   'KureM' is essentially the same as 'Either' 'String', except that it supports a 'MonadCatch' instance which 'Either' 'String' does not (because its 'fail' method calls 'error')
 --   A major advantage of this is that monadic pattern match failures are caught safely.
-data KureM a = Failure String | Success a deriving (Eq, Show)
+data KureM a = Failure String | Success a deriving (Eq, Show, Typeable)
 
 -- | Eliminator for 'KureM'.
 runKureM :: (a -> b) -> (String -> b) -> KureM a -> b
@@ -126,7 +134,7 @@
 
 -- | A monadic catch that ignores the error message.
 (<+) :: MonadCatch m => m a -> m a -> m a
-ma <+ mb = ma `catchM` const mb
+ma <+ mb = ma `catchM` (\_ -> mb)
 {-# INLINE (<+) #-}
 
 -- | Select the first monadic computation that succeeds, discarding any thereafter.
diff --git a/Language/KURE/Path.hs b/Language/KURE/Path.hs
--- a/Language/KURE/Path.hs
+++ b/Language/KURE/Path.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE CPP, InstanceSigs, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
 -- |
 -- Module: Language.KURE.Path
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -43,6 +49,8 @@
 
 import Control.Arrow ((>>^))
 
+import Data.Typeable
+
 import Language.KURE.Transform
 import Language.KURE.Combinators.Transform
 import Language.KURE.Injection
@@ -56,7 +64,7 @@
 -------------------------------------------------------------------------------
 
 -- | A 'SnocPath' is a list stored in reverse order.
-newtype SnocPath crumb = SnocPath [crumb] deriving Eq
+newtype SnocPath crumb = SnocPath [crumb] deriving (Eq, Typeable)
 
 instance Monoid (SnocPath crumb) where
    mempty :: SnocPath crumb
@@ -106,6 +114,10 @@
   -- | Extend the current 'AbsolutePath' by one crumb.
   (@@) :: c -> crumb -> c
 
+#if __GLASGOW_HASKELL__ >= 708
+deriving instance Typeable ExtendPath
+#endif
+
 -- | A 'SnocPath' from the root.
 type AbsolutePath = SnocPath
 
@@ -116,6 +128,10 @@
 class ReadPath c crumb | c -> crumb where
   -- | Read the current absolute path.
   absPath :: c -> AbsolutePath crumb
+
+#if __GLASGOW_HASKELL__ >= 708
+deriving instance Typeable ReadPath
+#endif
 
 -- | Lifted version of 'absPath'.
 absPathT :: (ReadPath c crumb, Monad m) => Transform c m a (AbsolutePath crumb)
diff --git a/Language/KURE/Pathfinder.hs b/Language/KURE/Pathfinder.hs
--- a/Language/KURE/Pathfinder.hs
+++ b/Language/KURE/Pathfinder.hs
@@ -1,4 +1,6 @@
-{-# LANGUAGE CPP, ScopedTypeVariables, FlexibleContexts #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 
 -- |
 -- Module: Language.KURE.Pathfinder
diff --git a/Language/KURE/Transform.hs b/Language/KURE/Transform.hs
--- a/Language/KURE/Transform.hs
+++ b/Language/KURE/Transform.hs
@@ -1,4 +1,7 @@
-{-# Language CPP, InstanceSigs #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE PolyKinds #-}
 -- |
 -- Module: Language.KURE.Transform
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -41,6 +44,9 @@
 #if __GLASGOW_HASKELL__ <= 708
 import Data.Monoid
 #endif
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
 
 import Language.KURE.MonadCatch
 
@@ -50,6 +56,9 @@
 --   The 'Transform' type is the basis of the entire KURE library.
 newtype Transform c m a b = Transform { -- | Apply a transformation to a value and its context.
                                         applyT :: c -> a -> m b}
+#if __GLASGOW_HASKELL__ >= 708
+  deriving Typeable
+#endif
 
 -- | A deprecated synonym for 'Transform'.
 type Translate c m a b = Transform c m a b
diff --git a/Language/KURE/Walker.hs b/Language/KURE/Walker.hs
--- a/Language/KURE/Walker.hs
+++ b/Language/KURE/Walker.hs
@@ -1,4 +1,10 @@
-{-# LANGUAGE CPP, InstanceSigs, MultiParamTypeClasses, ScopedTypeVariables, FlexibleContexts #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving #-}
 -- |
 -- Module: Language.KURE.Walker
 -- Copyright: (c) 2012--2014 The University of Kansas
@@ -77,6 +83,9 @@
 import Data.Maybe (isJust)
 import Data.Monoid
 import Data.DList (singleton, toList)
+#if __GLASGOW_HASKELL__ >= 708
+import Data.Typeable
+#endif
 
 #if __GLASGOW_HASKELL__ <= 708
 import Control.Applicative
@@ -133,6 +142,10 @@
   childL = childL_default
   {-# INLINE childL #-}
 
+#if __GLASGOW_HASKELL__ >= 708
+deriving instance Typeable Walker
+#endif
+
 ------------------------------------------------------------------------------------------
 
 -- | List the children of the current node.
@@ -593,7 +606,8 @@
 -------------------------------------------------------------------------------
 
 childL_default :: forall c crumb m u. (ReadPath c crumb, Eq crumb) => (Walker c u, MonadCatch m) => crumb -> Lens c m u u
-childL_default cr = lens $ do cu <- getter
+childL_default cr = lens $ prefixFailMsg "childL failed: " $
+                           do cu <- getter
                               k  <- setter
                               return (cu, k)
   where
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# KURE [![Hackage version](https://img.shields.io/hackage/v/kure.svg?style=flat)](http://hackage.haskell.org/package/kure) [![Build Status](https://img.shields.io/travis/ku-fpg/kure.svg?style=flat)](https://travis-ci.org/ku-fpg/kure)
+
+Combinators for Strategic Programming
diff --git a/kure.cabal b/kure.cabal
--- a/kure.cabal
+++ b/kure.cabal
@@ -1,5 +1,5 @@
 Name:                kure
-Version:             2.16.10
+Version:             2.16.12
 Synopsis:            Combinators for Strategic Programming
 Description:	     The Kansas University Rewrite Engine (KURE) is a domain-specific language for strategic rewriting.
 	 	     KURE was inspired by Stratego and StrategyLib, and has similarities with Scrap Your Boilerplate and Uniplate.
@@ -25,6 +25,8 @@
 build-type: 	     Simple
 Cabal-Version:       >= 1.10
 Extra-Source-Files:
+    README.md
+    CHANGELOG.md
     examples/Examples.hs
     examples/Fib/AST.hs
     examples/Fib/Kure.hs
