diff --git a/lib/Pinchot/Intervals.hs b/lib/Pinchot/Intervals.hs
--- a/lib/Pinchot/Intervals.hs
+++ b/lib/Pinchot/Intervals.hs
@@ -1,6 +1,7 @@
 {-# OPTIONS_HADDOCK not-home #-}
 {-# LANGUAGE OverloadedLists #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 
 -- | Intervals describe terminal symbols.  Ordinarily you will not
 -- need to use this module, as "Pinchot" re-exports the things you
@@ -9,6 +10,7 @@
 
 import qualified Control.Lens as Lens
 import Control.Monad (join)
+import Data.Data (Data)
 import Data.Monoid ((<>))
 import Data.Ord (comparing)
 import Data.Sequence (Seq, ViewL(EmptyL, (:<)), viewl, (<|))
@@ -30,7 +32,7 @@
   , _excluded :: Seq (a, a)
   -- ^ Each symbol in 'excluded' is not in the 'Intervals', even if
   -- the symbol is 'included'.
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Data)
 
 Lens.makeLenses ''Intervals
 
diff --git a/lib/Pinchot/NonEmpty.hs b/lib/Pinchot/NonEmpty.hs
--- a/lib/Pinchot/NonEmpty.hs
+++ b/lib/Pinchot/NonEmpty.hs
@@ -1,11 +1,13 @@
 {-# OPTIONS_HADDOCK not-home #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 -- | Sequences that always contain at least one element.
 
 module Pinchot.NonEmpty where
 
 import Control.Monad (join, ap)
+import Data.Data (Data)
 import Data.Semigroup (Semigroup((<>)))
 import Data.Sequence (Seq, (<|))
 import qualified Data.Sequence as Seq
@@ -17,7 +19,7 @@
   -- ^ The first item
   , _rest :: Seq a
   -- ^ All remaining items
-  } deriving (Eq, Ord, Show, Functor, Foldable, Traversable)
+  } deriving (Eq, Ord, Show, Data, Functor, Foldable, Traversable)
 
 instance Semigroup (NonEmpty a) where
   (NonEmpty a1 as) <> (NonEmpty b1 bs)
diff --git a/lib/Pinchot/Types.hs b/lib/Pinchot/Types.hs
--- a/lib/Pinchot/Types.hs
+++ b/lib/Pinchot/Types.hs
@@ -1,9 +1,11 @@
 {-# OPTIONS_HADDOCK not-home #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 module Pinchot.Types where
 
 import Pinchot.Intervals
 
 import qualified Control.Lens as Lens
+import Data.Data (Data)
 import Data.Sequence (Seq)
 import qualified Language.Haskell.TH as T
 
@@ -40,7 +42,7 @@
   { _ruleName :: RuleName
   , _ruleDescription :: Maybe String
   , _ruleType :: RuleType t
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Data)
 
 -- Can't use Template Haskell in this module due to corecursive
 -- types
@@ -63,7 +65,7 @@
 data Branch t = Branch
   { _branchName :: BranchName
   , _branches :: Seq (Rule t)
-  } deriving (Eq, Ord, Show)
+  } deriving (Eq, Ord, Show, Data)
 
 branchName :: Lens.Lens' (Branch t) BranchName
 branchName
@@ -82,7 +84,7 @@
   | Opt (Rule t)
   | Star (Rule t)
   | Plus (Rule t)
-  deriving (Eq, Ord, Show)
+  deriving (Eq, Ord, Show, Data)
 
 _Terminal :: Lens.Prism' (RuleType t) (Intervals t)
 _Terminal = Lens.prism' (\i -> Terminal i)
@@ -168,7 +170,7 @@
   { _line :: Int
   , _col :: Int
   , _pos :: Int
-  } deriving (Eq, Ord, Read, Show)
+  } deriving (Eq, Ord, Read, Show, Data)
 
 line :: Lens.Lens' Loc Int
 line = Lens.lens _line (\r l -> r { _line = l })
diff --git a/pinchot.cabal b/pinchot.cabal
--- a/pinchot.cabal
+++ b/pinchot.cabal
@@ -3,11 +3,11 @@
 -- http://www.github.com/massysett/cartel
 --
 -- Script name used to generate: genCabal.hs
--- Generated on: 2016-05-28 17:51:51.135563 EDT
+-- Generated on: 2016-07-07 14:15:57.679603 EDT
 -- Cartel library version: 0.16.0.0
 
 name: pinchot
-version: 0.18.0.2
+version: 0.18.2.0
 cabal-version: >= 1.14
 license: BSD3
 license-file: LICENSE
