diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+Version 1.4.1
+---------------
+* Fixed the templates for multi-constructor records
+* Made Rank2.TH.unsafeDeriveApply even more unsafe
+
 Version 1.4
 ---------------
 * Added Rank2.Compose :: ((* -> *) -> *) -> (* -> *) -> ((* -> *) -> *)
diff --git a/rank2classes.cabal b/rank2classes.cabal
--- a/rank2classes.cabal
+++ b/rank2classes.cabal
@@ -1,5 +1,5 @@
 name:                rank2classes
-version:             1.4.0.1
+version:             1.4.1
 synopsis:            standard type constructor class hierarchy, only with methods of rank 2 types
 description:
   A mirror image of the standard type constructor class hierarchy rooted in 'Functor', except with methods of rank 2
diff --git a/src/Rank2/TH.hs b/src/Rank2/TH.hs
--- a/src/Rank2/TH.hs
+++ b/src/Rank2/TH.hs
@@ -172,7 +172,7 @@
           ((,) fieldName <$>)
           <$> genFmapField (varE f) fieldType (appE (varE fieldName) (varE x)) id
    constraints <- (concat . (fst <$>)) <$> sequence constraintsAndFields
-   (,) constraints <$> clause [varP f, bangP (varP x)] body []
+   (,) constraints <$> clause [varP f, x `asP` recP name []] body []
 genFmapClause (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
@@ -214,7 +214,7 @@
        newNamedField (fieldName, _, fieldType) =
           fieldExp fieldName (genLiftA2Field unsafely (varE f) fieldType (getFieldOf x) (getFieldOf y) id)
           where getFieldOf = appE (varE fieldName) . varE
-   clause [varP f, bangP (varP x), varP y] body []
+   clause [varP f, x `asP` recP name [], varP y] body []
 genLiftA2Clause unsafely (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
@@ -235,7 +235,7 @@
         | t1 /= VarT typeVar -> genLiftA2Field unsafely fun t2 field1Access field2Access (appE (varE 'liftA2) . wrap)
      SigT ty _kind -> genLiftA2Field unsafely fun ty field1Access field2Access wrap
      ParensT ty -> genLiftA2Field unsafely fun ty field1Access field2Access wrap
-     _ | unsafely -> [| error "Cannot apply liftA2 to field" |]
+     _ | unsafely -> field1Access
        | otherwise -> error ("Cannot apply liftA2 to field of type " <> show fieldType)
 
 genLiftA3Clause :: Bool -> Con -> Q Clause
@@ -262,7 +262,7 @@
        newNamedField (fieldName, _, fieldType) =
           fieldExp fieldName (genLiftA3Field unsafely (varE f) fieldType (getFieldOf x) (getFieldOf y) (getFieldOf z) id)
           where getFieldOf = appE (varE fieldName) . varE
-   clause [varP f, bangP (varP x), varP y, varP z] body []
+   clause [varP f, x `asP` recP name [], varP y, varP z] body []
 genLiftA3Clause unsafely (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
@@ -286,7 +286,7 @@
           -> genLiftA3Field unsafely fun t2 field1Access field2Access field3Access (appE (varE 'liftA3) . wrap)
      SigT ty _kind -> genLiftA3Field unsafely fun ty field1Access field2Access field3Access wrap
      ParensT ty -> genLiftA3Field unsafely fun ty field1Access field2Access field3Access wrap
-     _ | unsafely -> [| error "Cannot apply liftA3 to field" |]
+     _ | unsafely -> field1Access
        | otherwise -> error ("Cannot apply liftA3 to field of type " <> show fieldType)
 
 genApClause :: Bool -> Con -> Q ([Type], Clause)
@@ -312,7 +312,7 @@
           ((,) fieldName <$>) <$> genApField unsafely fieldType (getFieldOf x) (getFieldOf y) id
           where getFieldOf = appE (varE fieldName) . varE
    constraints <- (concat . (fst <$>)) <$> sequence constraintsAndFields
-   (,) constraints <$> clause [varP x, bangP (varP y)] body []
+   (,) constraints <$> clause [x `asP` recP name [], varP y] body []
 genApClause unsafely (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
@@ -333,7 +333,7 @@
      AppT t1 t2 | t1 /= VarT typeVar -> genApField unsafely t2 field1Access field2Access (appE (varE 'liftA2) . wrap)
      SigT ty _kind -> genApField unsafely ty field1Access field2Access wrap
      ParensT ty -> genApField unsafely ty field1Access field2Access wrap
-     _ | unsafely -> (,) [] <$> [| error ("Cannot apply ap to field" <> $(pure $ LitE $ StringL $ show fieldType)) |]
+     _ | unsafely -> (,) [] <$> field1Access
        | otherwise -> error ("Cannot apply ap to field of type " <> show fieldType)
 
 genPureClause :: Con -> Q ([Type], Clause)
@@ -378,7 +378,7 @@
        newField x (_, fieldType) = genFoldMapField f fieldType (varE x) id
    constraints <- (concat . (fst <$>)) <$> sequence constraintsAndFields
    (,) constraints <$> clause pats (normalB body) []
-genFoldMapClause (RecC _name fields) = do
+genFoldMapClause (RecC name fields) = do
    f <- newName "f"
    x <- newName "x"
    let body | null fields = [| mempty |]
@@ -388,7 +388,7 @@
        newField :: VarBangType -> Q ([Type], Exp)
        newField (fieldName, _, fieldType) = genFoldMapField f fieldType (appE (varE fieldName) (varE x)) id
    constraints <- (concat . (fst <$>)) <$> sequence constraintsAndFields
-   (,) constraints <$> clause [varP f, bangP (varP x)] (normalB body) []
+   (,) constraints <$> clause [varP f, x `asP` recP name []] (normalB body) []
 genFoldMapClause (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
@@ -437,7 +437,7 @@
        newField :: VarBangType -> Q ([Type], Exp)
        newField (fieldName, _, fieldType) = genTraverseField (varE f) fieldType (appE (varE fieldName) (varE x)) id
    constraints <- (concat . (fst <$>)) <$> sequence constraintsAndFields
-   (,) constraints <$> clause [varP f, bangP (varP x)] body []
+   (,) constraints <$> clause [varP f, x `asP` recP name []] body []
 genTraverseClause (GadtC [name] fieldTypes _resultType@(AppT _ (VarT tyVar))) =
    do Just (Deriving tyConName _tyVar) <- getQ
       putQ (Deriving tyConName tyVar)
