diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for large-anon
 
+## 0.3.2 -- 2025-03-11
+
+* Use ghc-tcplugin-api 0.14 (Chan Siu Man, #169)
+* Add role annotation to `Record` (Sam Derbyshire, #167)
+
 ## 0.3.1 -- 2024-05-30
 
 * Support ghc 9.6 (and drop ghc <= 8.8)
diff --git a/large-anon.cabal b/large-anon.cabal
--- a/large-anon.cabal
+++ b/large-anon.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               large-anon
-version:            0.3.1
+version:            0.3.2
 synopsis:           Scalable anonymous records
 description:        The @large-anon@ package provides support for anonymous
                     records in Haskell, with a focus on compile-time (and
@@ -10,9 +10,12 @@
 author:             Edsko de Vries
 maintainer:         edsko@well-typed.com
 category:           Records
-extra-source-files: CHANGELOG.md
+extra-doc-files:    CHANGELOG.md
                     test/Test/Sanity/RebindableSyntax/Tests.hs
-tested-with:        GHC ==8.10.7 || ==9.2.8 || ==9.4.8 || ==9.6.4
+tested-with:        GHC ==8.10.7
+                    GHC ==9.2.8
+                    GHC ==9.4.8
+                    GHC ==9.6.6
 
 library
   exposed-modules:
@@ -74,8 +77,8 @@
     , base             >= 4.14  && < 4.19
     , containers       >= 0.6.2 && < 0.8
     , deepseq          >= 1.4.4 && < 1.6
-    , ghc              >= 8.10  && < 9.7 
-    , ghc-tcplugin-api >= 0.11  && < 0.12
+    , ghc              >= 8.10  && < 9.7
+    , ghc-tcplugin-api >= 0.14  && < 0.15
     , hashable         >= 1.3   && < 1.5
     , mtl              >= 2.2.1 && < 2.4
     , optics-core      >= 0.3   && < 0.5
@@ -201,9 +204,9 @@
   hs-source-dirs:
       fourmolu-preprocessor
   build-depends:
-    , base
-    , fourmolu >= 0.10.1
-    , text
+    , base     >= 4.16   && < 4.19
+    , fourmolu >= 0.10.1 && < 0.16
+    , text     >= 1.2    && < 2.1
   default-language:
       Haskell2010
   ghc-options:
diff --git a/src/Data/Record/Anon/Internal/Advanced.hs b/src/Data/Record/Anon/Internal/Advanced.hs
--- a/src/Data/Record/Anon/Internal/Advanced.hs
+++ b/src/Data/Record/Anon/Internal/Advanced.hs
@@ -9,6 +9,7 @@
 {-# LANGUAGE PolyKinds             #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE RecordWildCards       #-}
+{-# LANGUAGE RoleAnnotations       #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TypeApplications      #-}
 {-# LANGUAGE TypeFamilies          #-}
@@ -126,6 +127,8 @@
 data Record (f :: k -> Type) (r :: Row k) =
     NoPending  {-# UNPACK #-} !(Canonical f)
   | HasPending {-# UNPACK #-} !(Canonical f) !(Diff f)
+
+type role Record representational representational
 
 {-------------------------------------------------------------------------------
   Conversion
diff --git a/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/RowHasField.hs b/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/RowHasField.hs
--- a/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/RowHasField.hs
+++ b/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/RowHasField.hs
@@ -146,7 +146,7 @@
             return (Nothing, [])
           Just info -> do
             eq <- newWanted loc $
-                    mkPrimEqPredRole Nominal
+                    mkEqPredRole Nominal
                       hasFieldTypeField
                       (knownRowFieldInfo info)
             ev <- evidenceHasField rn hf (knownRowFieldIndex info)
diff --git a/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/SubRow.hs b/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/SubRow.hs
--- a/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/SubRow.hs
+++ b/src/Data/Record/Anon/Internal/Plugin/TC/Constraints/SubRow.hs
@@ -133,7 +133,7 @@
         case rhs `KnownRow.isSubRowOf` lhs of
           Right inBoth -> do
             eqs <- forM inBoth $ \(Target r, Source l) -> newWanted loc $
-                     mkPrimEqPredRole
+                     mkEqPredRole
                        Nominal
                        (knownRowFieldInfo l)
                        (knownFieldInfo r)
diff --git a/src/Data/Record/Anon/Internal/Plugin/TC/Rewriter.hs b/src/Data/Record/Anon/Internal/Plugin/TC/Rewriter.hs
--- a/src/Data/Record/Anon/Internal/Plugin/TC/Rewriter.hs
+++ b/src/Data/Record/Anon/Internal/Plugin/TC/Rewriter.hs
@@ -65,6 +65,7 @@
                mkTyFamAppReduction
                  "large-anon"
                  Nominal
+                 []
                  fun
                  args
                  (computeMetadataOf argsFunctor knownFields)
