diff --git a/app/App/Commands/Count.hs b/app/App/Commands/Count.hs
--- a/app/App/Commands/Count.hs
+++ b/app/App/Commands/Count.hs
@@ -17,6 +17,7 @@
 import Data.Generics.Product.Any
 import Data.Semigroup                             ((<>))
 import Data.Text                                  (Text)
+import GHC.Generics
 import HaskellWorks.Data.TreeCursor
 import HaskellWorks.Data.Xml.DecodeResult
 import HaskellWorks.Data.Xml.RawDecode
@@ -40,11 +41,11 @@
 data Plant = Plant
   { common :: String
   , price  :: String
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 newtype Catalog = Catalog
   { plants :: [Plant]
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic)
 
 tags :: Value -> String -> [Value]
 tags xml@(XmlElement n _ _) elemName = if n == elemName
diff --git a/hw-xml.cabal b/hw-xml.cabal
--- a/hw-xml.cabal
+++ b/hw-xml.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:                 hw-xml
-version:              0.4.0.4
+version:              0.4.0.5
 synopsis:             XML parser based on succinct data structures.
 description:          XML parser based on succinct data structures. Please see README.md
 category:             Data, XML, Succinct Data Structures, Data Structures
@@ -38,7 +38,7 @@
 common hedgehog                   { build-depends: hedgehog                   >= 1.0        && < 1.1    }
 common hspec                      { build-depends: hspec                      >= 2.5        && < 3.0    }
 common hw-balancedparens          { build-depends: hw-balancedparens          >= 0.3.0.1    && < 0.4    }
-common hw-bits                    { build-depends: hw-bits                    >= 0.7.0.7    && < 0.8    }
+common hw-bits                    { build-depends: hw-bits                    >= 0.7.0.9    && < 0.8    }
 common hw-hspec-hedgehog          { build-depends: hw-hspec-hedgehog          >= 0.1        && < 0.2    }
 common hw-parser                  { build-depends: hw-parser                  >= 0.1.0.1    && < 0.2    }
 common hw-prim                    { build-depends: hw-prim                    >= 0.6.2.39   && < 0.7    }
@@ -128,6 +128,7 @@
   import:               base, config
                       , attoparsec
                       , bytestring
+                      , deepseq
                       , generic-lens
                       , hw-balancedparens
                       , hw-bits
diff --git a/src/HaskellWorks/Data/Xml/DecodeError.hs b/src/HaskellWorks/Data/Xml/DecodeError.hs
--- a/src/HaskellWorks/Data/Xml/DecodeError.hs
+++ b/src/HaskellWorks/Data/Xml/DecodeError.hs
@@ -1,5 +1,9 @@
+{-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 module HaskellWorks.Data.Xml.DecodeError where
 
-newtype DecodeError = DecodeError String deriving (Eq, Show)
+import Control.DeepSeq
+import GHC.Generics
+
+newtype DecodeError = DecodeError String deriving (Eq, Show, Generic, NFData)
diff --git a/src/HaskellWorks/Data/Xml/Index.hs b/src/HaskellWorks/Data/Xml/Index.hs
--- a/src/HaskellWorks/Data/Xml/Index.hs
+++ b/src/HaskellWorks/Data/Xml/Index.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveAnyClass    #-}
+{-# LANGUAGE DeriveGeneric     #-}
 {-# LANGUAGE FlexibleInstances #-}
 
 module HaskellWorks.Data.Xml.Index
@@ -5,8 +7,10 @@
   , indexVersion
   ) where
 
+import Control.DeepSeq
 import Data.Serialize
 import Data.Word
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitShown
 
 import qualified Data.Vector.Storable as DVS
@@ -18,7 +22,7 @@
   { xiVersion        :: String
   , xiInterests      :: BitShown (DVS.Vector Word64)
   , xiBalancedParens :: BitShown (DVS.Vector Word64)
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, NFData)
 
 putBitShownVector :: Putter (BitShown (DVS.Vector Word64))
 putBitShownVector = putVector . bitShown
diff --git a/src/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParens.hs b/src/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParens.hs
--- a/src/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParens.hs
+++ b/src/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParens.hs
@@ -1,7 +1,9 @@
-{-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE FlexibleInstances     #-}
-{-# LANGUAGE InstanceSigs          #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE InstanceSigs               #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
 
 module HaskellWorks.Data.Xml.Succinct.Cursor.BalancedParens
   ( XmlBalancedParens(..)
@@ -9,8 +11,10 @@
   ) where
 
 import Control.Applicative
+import Control.DeepSeq
 import Data.Word
-import HaskellWorks.Data.BalancedParens                 as BP
+import GHC.Generics
+import HaskellWorks.Data.BalancedParens
 import HaskellWorks.Data.Xml.Internal.BalancedParens
 import HaskellWorks.Data.Xml.Internal.List
 import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
@@ -18,7 +22,7 @@
 import qualified Data.ByteString      as BS
 import qualified Data.Vector.Storable as DVS
 
-newtype XmlBalancedParens a = XmlBalancedParens a
+newtype XmlBalancedParens a = XmlBalancedParens a deriving (Eq, Show, Generic, NFData)
 
 getXmlBalancedParens :: XmlBalancedParens a -> a
 getXmlBalancedParens (XmlBalancedParens a) = a
diff --git a/src/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXml.hs b/src/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXml.hs
--- a/src/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXml.hs
+++ b/src/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXml.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 module HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
   ( BlankedXml(..)
@@ -8,6 +9,7 @@
   , lbsToBlankedXml
   ) where
 
+import Control.DeepSeq
 import GHC.Generics
 import HaskellWorks.Data.Xml.Internal.Blank
 
@@ -16,7 +18,7 @@
 
 newtype BlankedXml = BlankedXml
   { unblankedXml :: [BS.ByteString]
-  } deriving (Eq, Show, Generic)
+  } deriving (Eq, Show, Generic, NFData)
 
 getBlankedXml :: BlankedXml -> [BS.ByteString]
 getBlankedXml (BlankedXml bs) = bs
diff --git a/src/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBits.hs b/src/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBits.hs
--- a/src/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBits.hs
+++ b/src/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBits.hs
@@ -1,7 +1,9 @@
-{-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE FlexibleInstances     #-}
-{-# LANGUAGE InstanceSigs          #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE InstanceSigs               #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
 
 module HaskellWorks.Data.Xml.Succinct.Cursor.InterestBits
   ( XmlInterestBits(..)
@@ -12,8 +14,10 @@
   ) where
 
 import Control.Applicative
+import Control.DeepSeq
 import Data.ByteString.Internal
 import Data.Word
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitShown
 import HaskellWorks.Data.FromByteString
 import HaskellWorks.Data.RankSelect.Poppy512
@@ -23,7 +27,7 @@
 import qualified Data.ByteString      as BS
 import qualified Data.Vector.Storable as DVS
 
-newtype XmlInterestBits a = XmlInterestBits a
+newtype XmlInterestBits a = XmlInterestBits a deriving (Eq, Show, Generic, NFData)
 
 getXmlInterestBits :: XmlInterestBits a -> a
 getXmlInterestBits (XmlInterestBits a) = a
