diff --git a/hw-json-standard-cursor.cabal b/hw-json-standard-cursor.cabal
--- a/hw-json-standard-cursor.cabal
+++ b/hw-json-standard-cursor.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:                   hw-json-standard-cursor
-version:                0.2.3.0
+version:                0.2.3.1
 synopsis:               Memory efficient JSON parser
 description:            Memory efficient JSON parser. Please see README.md
 category:               Data
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/Generic.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/Generic.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/Generic.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/Generic.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveGeneric         #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE InstanceSigs          #-}
@@ -11,6 +12,7 @@
   , jsonCursorPos
   ) where
 
+import GHC.Generics
 import HaskellWorks.Data.Positioning
 import HaskellWorks.Data.RankSelect.Base.Rank0
 import HaskellWorks.Data.RankSelect.Base.Rank1
@@ -26,7 +28,7 @@
   , balancedParens :: !w
   , cursorRank     :: !Count
   }
-  deriving (Eq, Show)
+  deriving (Eq, Generic, Show)
 
 instance (BP.BalancedParens u, Rank1 u, Rank0 u) => TreeCursor (GenericCursor t v u) where
   firstChild :: GenericCursor t v u -> Maybe (GenericCursor t v u)
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/IbBp.hs
@@ -1,13 +1,15 @@
-{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE DeriveGeneric #-}
 
 module HaskellWorks.Data.Json.Standard.Cursor.IbBp
   ( IbBp(..)
   , slowToIbBp
-  , simdToIbBp) where
+  , simdToIbBp
+  ) where
 
 import Control.Monad
 import Control.Monad.ST                    (ST)
 import Data.Word
+import GHC.Generics
 import HaskellWorks.Data.Vector.AsVector64
 
 import qualified Data.ByteString                                                    as BS
@@ -24,7 +26,7 @@
 data IbBp = IbBp
   { ib :: DVS.Vector Word64
   , bp :: DVS.Vector Word64
-  }
+  } deriving Generic
 
 slowToIbBp :: BS.ByteString -> IbBp
 slowToIbBp bs = IbBp
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/Blank.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/Blank.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/Blank.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/Blank.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE BangPatterns  #-}
+{-# LANGUAGE DeriveGeneric #-}
 
 module HaskellWorks.Data.Json.Standard.Cursor.Internal.Blank
   ( blankJson
@@ -7,6 +8,7 @@
 import Data.ByteString                                       (ByteString)
 import Data.Word
 import Data.Word8
+import GHC.Generics
 import HaskellWorks.Data.Json.Standard.Cursor.Internal.Word8
 import Prelude                                               as P
 
@@ -18,6 +20,7 @@
   | InString
   | InNumber
   | InIdent
+  deriving Generic
 
 blankJson :: [BS.ByteString] -> [BS.ByteString]
 blankJson = blankJson' InJson
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/MakeIndex.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/MakeIndex.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/MakeIndex.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/MakeIndex.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveGeneric     #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes        #-}
 
@@ -15,6 +16,7 @@
 import Data.Int
 import Data.Word
 import Data.Word8
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
 import Prelude                        as P
 
@@ -98,7 +100,7 @@
             MiniTF -> Just (0xFF, (Just False , cs))
           Nothing   -> Nothing
 
-data MiniBP = MiniN | MiniT | MiniF | MiniTF
+data MiniBP = MiniN | MiniT | MiniF | MiniTF deriving Generic
 
 balancedParensOf :: Word8 -> MiniBP
 balancedParensOf c = case c of
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/Internal/StateMachine.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE BinaryLiterals             #-}
+{-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings          #-}
 
@@ -14,6 +15,7 @@
   ) where
 
 import Data.Word
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
 
 import qualified Data.Vector                                           as DV
@@ -22,9 +24,9 @@
 
 {-# ANN module ("HLint: ignore Redundant guard"  :: String) #-}
 
-newtype IntState = IntState Int deriving (Eq, Ord, Show, Num)
+newtype IntState = IntState Int deriving (Eq, Ord, Show, Num, Generic)
 
-data State = InJson | InString | InEscape | InValue deriving (Eq, Enum, Bounded, Show)
+data State = InJson | InString | InEscape | InValue deriving (Eq, Enum, Bounded, Show, Generic)
 
 phiTable :: DV.Vector (DVS.Vector Word8)
 phiTable = DV.generate 5 gos
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/SemiIndex.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE BinaryLiterals      #-}
 {-# LANGUAGE DeriveFunctor       #-}
+{-# LANGUAGE DeriveGeneric       #-}
 {-# LANGUAGE DeriveTraversable   #-}
 {-# LANGUAGE InstanceSigs        #-}
 {-# LANGUAGE MultiWayIf          #-}
@@ -23,6 +24,7 @@
 import Data.Bits.Pext
 import Data.Word
 import Foreign.Storable                                             (Storable (..))
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
 import HaskellWorks.Data.Bits.PopCount.PopCount1
 import HaskellWorks.Data.Json.Standard.Cursor.Internal.StateMachine (IntState (..), State (..))
@@ -50,17 +52,17 @@
   { preSiChunkIb   :: !v -- interest bits
   , preSiChunkBpOp :: !v -- balanced parens interest bits
   , preSiChunkBpCl :: !v -- balanced parens open close
-  } deriving (Functor, Traversable, Foldable)
+  } deriving (Functor, Traversable, Foldable, Generic)
 
 data SiChunk v = SiChunk
   { siChunkIb :: !v -- interest bits
   , siChunkBp :: !v -- balanced parens open close
-  } deriving (Functor, Traversable, Foldable)
+  } deriving (Functor, Traversable, Foldable, Generic)
 
 data SemiIndex v = SemiIndex
   { semiIndexIb :: !v
   , semiIndexBp :: !v
-  } deriving (Functor, Traversable, Foldable)
+  } deriving (Functor, Traversable, Foldable, Generic)
 
 semiIndexBuilder :: LBS.ByteString -> SemiIndex B.Builder
 semiIndexBuilder lbs = SemiIndex (B.lazyByteString ibs) (B.byteString (BS.toByteString bps))
diff --git a/src/HaskellWorks/Data/Json/Standard/Cursor/Type.hs b/src/HaskellWorks/Data/Json/Standard/Cursor/Type.hs
--- a/src/HaskellWorks/Data/Json/Standard/Cursor/Type.hs
+++ b/src/HaskellWorks/Data/Json/Standard/Cursor/Type.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE DeriveGeneric         #-}
 {-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE InstanceSigs          #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
@@ -10,6 +11,7 @@
 import Data.Char
 import Data.String
 import Data.Word8
+import GHC.Generics
 import HaskellWorks.Data.Bits.BitWise
 import HaskellWorks.Data.Drop
 import HaskellWorks.Data.Json.Standard.Cursor.Generic
@@ -32,7 +34,7 @@
   | JsonTypeNumber
   | JsonTypeObject
   | JsonTypeString
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic)
 
 class JsonTypeAt a where
   jsonTypeAtPosition :: Position -> a -> Maybe JsonType
