diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for PyF
 
+## 0.11.5.0 -- 2025-12-01
+
+- Release with support for GHC 9.14 (tested with -rc1)
+
 ## 0.11.4.0 -- 2025-01-03
 
 - Fix indentation in `fmtTrim` when line break was escaped (bug https://github.com/guibou/PyF/issues/141).
diff --git a/PyF.cabal b/PyF.cabal
--- a/PyF.cabal
+++ b/PyF.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               PyF
-version:            0.11.4.0
+version:            0.11.5.0
 synopsis:
   Quasiquotations for a python like interpolated string formatter
 
@@ -31,14 +31,14 @@
     PyF.Internal.QQ
 
   build-depends:
-    , base              >=4.12   && <4.22
+    , base              >=4.12   && <4.23
     , bytestring        >=0.10.8 && <0.13
     , ghc               >=8.6.1
     , mtl               >=2.2.2  && <2.4
     , parsec            >=3.1.13 && <3.2
-    , template-haskell  >=2.14.0 && <2.24
+    , template-haskell  >=2.14.0 && <2.25
     , text              >=1.2.3  && <2.2
-    , time              >=1.8.0  && <1.15
+    , time              >=1.8.0  && <1.16
 
   if impl(ghc <9.2.1)
     build-depends: ghc-boot >=8.6.1 && <9.7
diff --git a/src/PyF/Internal/Meta.hs b/src/PyF/Internal/Meta.hs
--- a/src/PyF/Internal/Meta.hs
+++ b/src/PyF/Internal/Meta.hs
@@ -6,6 +6,8 @@
 
 module PyF.Internal.Meta (toExp, baseDynFlags, toName) where
 
+import qualified Data.List.NonEmpty as NE
+
 #if MIN_VERSION_ghc(9,2,0)
 import GHC.Hs.Type (HsWildCardBndrs (..), HsType (..), HsSigType(HsSig), sig_body)
 #elif MIN_VERSION_ghc(9,0,0)
@@ -95,8 +97,13 @@
 toLit (HsWordPrim _ i) = TH.WordPrimL i
 toLit (HsInt64Prim _ i) = TH.IntegerL i
 toLit (HsWord64Prim _ i) = TH.WordPrimL i
-toLit (HsInteger _ i _) = TH.IntegerL i
+#if MIN_VERSION_ghc(9,13,0)
+-- toLit (HsRat _ f _) = TH.FloatPrimL (fl_value f)
+-- toLit (HsInteger _ i _) = TH.IntegerL i
+#else
 toLit (HsRat _ f _) = TH.FloatPrimL (fl_value f)
+toLit (HsInteger _ i _) = TH.IntegerL i
+#endif
 toLit (HsFloatPrim _ f) = TH.FloatPrimL (fl_value f)
 toLit (HsDoublePrim _ f) = TH.DoublePrimL (fl_value f)
 #if MIN_VERSION_ghc(9,7,0)
@@ -150,13 +157,16 @@
    in if isRdrDataCon n'
         then TH.ConE (toName n')
         else TH.VarE (toName n')
-#if MIN_VERSION_ghc(9,6,0)
+#if MIN_VERSION_ghc(9, 13, 0)
+
+#elif MIN_VERSION_ghc(9,6,0)
 toExp _ (Expr.HsUnboundVar _ n)              = TH.UnboundVarE (TH.mkName . occNameString . rdrNameOcc $ n)
 #elif MIN_VERSION_ghc(9,0,0)
 toExp _ (Expr.HsUnboundVar _ n)              = TH.UnboundVarE (TH.mkName . occNameString $ n)
 #else
 toExp _ (Expr.HsUnboundVar _ n)              = TH.UnboundVarE (TH.mkName . occNameString . Expr.unboundVarOcc $ n)
 #endif
+
 toExp _ Expr.HsIPVar {} = noTH "toExp" "HsIPVar"
 toExp _ (Expr.HsLit _ l) = TH.LitE (toLit l)
 toExp _ (Expr.HsOverLit _ OverLit {ol_val}) = TH.LitE (toLit' ol_val)
@@ -179,8 +189,10 @@
 #endif
 toExp d (Expr.OpApp _ e1 o e2) = TH.UInfixE (toExp d . unLoc $ e1) (toExp d . unLoc $ o) (toExp d . unLoc $ e2)
 toExp d (Expr.NegApp _ e _) = TH.AppE (TH.VarE 'negate) (toExp d . unLoc $ e)
+#if MIN_VERSION_ghc(9,13,0)
+toExp d (Expr.HsLam _ _ (Expr.MG _ (unLoc -> (map unLoc -> [Expr.Match _ _ (unLoc -> map unLoc -> ps) (Expr.GRHSs _ (NE.toList -> [unLoc -> Expr.GRHS _ _ (unLoc -> e)]) _)])))) = TH.LamE (fmap (toPat d) ps) (toExp d e)
+#elif MIN_VERSION_ghc(9,12,0)
 -- NOTE: for lambda, there is only one match
-#if MIN_VERSION_ghc(9,12,0)
 toExp d (Expr.HsLam _ _ (Expr.MG _ (unLoc -> (map unLoc -> [Expr.Match _ _ (unLoc -> map unLoc -> ps) (Expr.GRHSs _ [unLoc -> Expr.GRHS _ _ (unLoc -> e)] _)])))) = TH.LamE (fmap (toPat d) ps) (toExp d e)
 #elif MIN_VERSION_ghc(9,10,0)
 toExp d (Expr.HsLam _ _ (Expr.MG _ (unLoc -> (map unLoc -> [Expr.Match _ _ (map unLoc -> ps) (Expr.GRHSs _ [unLoc -> Expr.GRHS _ _ (unLoc -> e)] _)])))) = TH.LamE (fmap (toPat d) ps) (toExp d e)
diff --git a/src/PyF/Internal/ParserEx.hs b/src/PyF/Internal/ParserEx.hs
--- a/src/PyF/Internal/ParserEx.hs
+++ b/src/PyF/Internal/ParserEx.hs
@@ -96,16 +96,28 @@
 import GHC.Driver.Config.Parser (initParserOpts)
 #endif
 
+#if MIN_VERSION_ghc(9,13,0)
+import GHC.Unit.Types (UnitId(..))
+#endif
+
 import Data.Maybe
 
 fakeSettings :: Settings
 fakeSettings = Settings
-#if MIN_VERSION_ghc(9, 2, 0)
+#if MIN_VERSION_ghc(9, 13, 0)
   { sGhcNameVersion=ghcNameVersion
   , sFileSettings=fileSettings
   , sTargetPlatform=platform
+  , sToolSettings=toolSettings
   , sPlatformMisc=platformMisc
+  , sUnitSettings = UnitSettings (UnitId $ fsLit "pyf-preprocessor")
+  }
+#elif MIN_VERSION_ghc(9, 2, 0)
+  { sGhcNameVersion=ghcNameVersion
+  , sFileSettings=fileSettings
+  , sTargetPlatform=platform
   , sToolSettings=toolSettings
+  , sPlatformMisc=platformMisc
   }
 #elif MIN_VERSION_ghc(8, 10, 0)
   { sGhcNameVersion=ghcNameVersion
diff --git a/src/PyF/Internal/QQ.hs b/src/PyF/Internal/QQ.hs
--- a/src/PyF/Internal/QQ.hs
+++ b/src/PyF/Internal/QQ.hs
@@ -27,6 +27,8 @@
   )
 where
 
+import qualified Data.List.NonEmpty as NE
+
 import Control.Monad.Reader
 import Data.Data (Data (gmapQ), Typeable, cast)
 import Data.Kind
@@ -196,7 +198,13 @@
       Just (HsVar _ l) -> [l]
 #endif
 
-#if MIN_VERSION_ghc(9,12,0)
+#if MIN_VERSION_ghc(9,13,0)
+      Just (HsLam _ _ (MG _ (unLoc -> (map unLoc -> [Expr.Match _ _ (unLoc -> map unLoc -> ps) (GRHSs _ (NE.toList -> [unLoc -> GRHS _ _ (unLoc -> e)]) _)])))) -> filter keepVar subVars
+        where
+          keepVar (L _ n) = n `notElem` subPats
+          subVars = concat $ gmapQ f [e]
+          subPats = concat $ gmapQ findPats ps
+#elif MIN_VERSION_ghc(9,12,0)
       Just (HsLam _ _ (MG _ (unLoc -> (map unLoc -> [Expr.Match _ _ (unLoc -> map unLoc -> ps) (GRHSs _ [unLoc -> GRHS _ _ (unLoc -> e)] _)])))) -> filter keepVar subVars
         where
           keepVar (L _ n) = n `notElem` subPats
@@ -273,7 +281,10 @@
 reportErrorAt :: SrcSpan -> String -> Q ()
 reportErrorAt loc msg = unsafeRunTcM $ addErrAt loc msg'
   where
-#if MIN_VERSION_ghc(9,7,0)
+#if MIN_VERSION_ghc(9,13,0)
+    -- TODO: maybe leverage the "hint" logic to add additionnal hints here?
+    msg' = TcRnUnknownMessage (UnknownDiagnostic (const NoDiagnosticOpts) (\x -> x) (mkPlainError noHints (text msg)))
+#elif MIN_VERSION_ghc(9,7,0)
     msg' = TcRnUnknownMessage (UnknownDiagnostic (const NoDiagnosticOpts) (mkPlainError noHints (text msg)))
 #elif MIN_VERSION_ghc(9,6,0)
     msg' = TcRnUnknownMessage (UnknownDiagnostic $ mkPlainError noHints $
