diff --git a/sexp-grammar.cabal b/sexp-grammar.cabal
--- a/sexp-grammar.cabal
+++ b/sexp-grammar.cabal
@@ -1,5 +1,5 @@
 name:                sexp-grammar
-version:             2.2.1
+version:             2.3.0
 license:             BSD3
 license-file:        LICENSE
 author:              Yevhen Smolanka, Sergey Vinokurov
@@ -46,10 +46,11 @@
     , base               >=4.7   && <5.0
     , bytestring         >=0.10  && <0.11
     , containers         >=0.5.5 && <0.7
+    , data-fix           >=0.3   && <0.4
     , deepseq            >=1.0   && <2.0
     , invertible-grammar >=0.1.3 && <0.2
     , prettyprinter      >=1     && <1.8
-    , recursion-schemes  >=5.0   && <5.2
+    , recursion-schemes  >=5.2   && <5.3
     , scientific         >=0.3.3 && <0.4
     , semigroups         >=0.16  && <0.20
     , text               >=1.2   && <1.3
diff --git a/src/Language/Sexp/Located.hs b/src/Language/Sexp/Located.hs
--- a/src/Language/Sexp/Located.hs
+++ b/src/Language/Sexp/Located.hs
@@ -40,8 +40,8 @@
   ) where
 
 import Data.ByteString.Lazy.Char8 (ByteString, unpack)
+import Data.Fix (Fix (..))
 import Data.Functor.Compose
-import Data.Functor.Foldable (Fix (..))
 import Data.Scientific (Scientific)
 import Data.Text (Text)
 
diff --git a/src/Language/Sexp/Types.hs b/src/Language/Sexp/Types.hs
--- a/src/Language/Sexp/Types.hs
+++ b/src/Language/Sexp/Types.hs
@@ -22,10 +22,12 @@
 
 import Control.DeepSeq
 
+import Data.Bifunctor
+
+import Data.Fix (Fix (..))
 import Data.Functor.Classes
 import Data.Functor.Compose
-import Data.Functor.Foldable (cata, Fix (..))
-import Data.Bifunctor
+import Data.Functor.Foldable (cata)
 import Data.Scientific (Scientific)
 import Data.Text (Text)
 import Data.Text.Prettyprint.Doc (Pretty (..), colon, (<>))
@@ -119,16 +121,13 @@
 
 instance NFData Position
 
-instance NFData (Fix SexpF) where
-  rnf = cata alg
-    where
-      alg :: SexpF () -> ()
-      alg = \case
-        AtomF a -> rnf a
-        ParenListF as -> rnf as
-        BracketListF as -> rnf as
-        BraceListF as -> rnf as
-        ModifiedF q a -> rnf q `seq` rnf a
+instance NFData1 SexpF where
+  liftRnf f = \case
+    AtomF a -> rnf a
+    ParenListF as -> liftRnf f as
+    BracketListF as -> liftRnf f as
+    BraceListF as -> liftRnf f as
+    ModifiedF q a -> rnf q `seq` f a
 
-instance NFData (Fix (Compose (LocatedBy Position) SexpF)) where
-  rnf = rnf . stripLocation
+instance NFData1 (Compose (LocatedBy Position) SexpF) where
+  liftRnf f = liftRnf f . extract . getCompose
diff --git a/src/Language/SexpGrammar/Base.hs b/src/Language/SexpGrammar/Base.hs
--- a/src/Language/SexpGrammar/Base.hs
+++ b/src/Language/SexpGrammar/Base.hs
@@ -444,7 +444,7 @@
 --
 -- >>> encodeWith (hashed symbol) "foo"
 -- Right "#foo"
-hashed :: Grammar Position (Sexp :- t) (a :- t) -> Grammar Position (Sexp :- t) (a :- t)
+hashed :: Grammar Position (Sexp :- t) t' -> Grammar Position (Sexp :- t) t'
 hashed g = prefix Hash >>> g
 
 -- | Grammar matching a prefixed S-expression, runs a sub-grammar on a
@@ -452,7 +452,7 @@
 --
 -- >>> encodeWith (quoted symbol) "foo"
 -- Right "'foo"
-quoted :: Grammar Position (Sexp :- t) (a :- t) -> Grammar Position (Sexp :- t) (a :- t)
+quoted :: Grammar Position (Sexp :- t) t' -> Grammar Position (Sexp :- t) t'
 quoted g = prefix Quote >>> g
 
 
@@ -461,5 +461,5 @@
 --
 -- >>> encodeWith (prefixed Backtick symbol) "foo"
 -- Right "`foo"
-prefixed :: Prefix -> Grammar Position (Sexp :- t) (a :- t) -> Grammar Position (Sexp :- t) (a :- t)
+prefixed :: Prefix -> Grammar Position (Sexp :- t) t' -> Grammar Position (Sexp :- t) t'
 prefixed m g = prefix m >>> g
