diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,8 @@
 
+# Version 0.5.1.0 (2021-08-31)
+
+- Fix a bug in the type-family rewriting compatibility layer (GHC 8.10, 9.0, 9.2)
+  by correctly downgrading the coercion used to cast the evidence, when necessary.
 
 # Version 0.5.0.0 (2021-08-30)
 
diff --git a/ghc-tcplugin-api.cabal b/ghc-tcplugin-api.cabal
--- a/ghc-tcplugin-api.cabal
+++ b/ghc-tcplugin-api.cabal
@@ -1,6 +1,6 @@
 cabal-version:  3.0
 name:           ghc-tcplugin-api
-version:        0.5.0.0
+version:        0.5.1.0
 synopsis:       An API for type-checker plugins.
 license:        BSD-3-Clause
 build-type:     Simple
diff --git a/src/GHC/TcPlugin/API/Internal/Shim.hs b/src/GHC/TcPlugin/API/Internal/Shim.hs
--- a/src/GHC/TcPlugin/API/Internal/Shim.hs
+++ b/src/GHC/TcPlugin/API/Internal/Shim.hs
@@ -50,7 +50,8 @@
 
 -- ghc
 import GHC.Core.Coercion
-  ( mkReflCo, mkSymCo
+  ( coercionRole
+  , mkReflCo, mkSymCo
   , mkAppCos, mkNomReflCo, mkSubCo
   , mkTyConAppCo, tyConRolesX
   , tyConRolesRepresentational
@@ -310,11 +311,16 @@
         Given     -> error "ghc-tcplugin-api: unexpected Given in reduceCt"
         Wanted {} -> newWanted  ( ctLoc ct ) predTy'
         Derived   -> newDerived ( ctLoc ct ) predTy'
+      let
+        role :: Role
+        role = coercionRole co
+        cast_co :: Coercion
+        cast_co = mkSymCo $ case role of
+          Nominal -> mkSubCo co
+          _       -> co
       pure ( Just
               ( mkNonCanonical ctEv'
-              , ( evCast ( ctEvExpr ctEv' ) ( mkSymCo co )
-                , ct
-                )
+              , ( evCast ( ctEvExpr ctEv' ) cast_co, ct )
               )
            , newCts
            )
