diff --git a/generic-src/Language/Haskell/GHC/Parser.hs b/generic-src/Language/Haskell/GHC/Parser.hs
--- a/generic-src/Language/Haskell/GHC/Parser.hs
+++ b/generic-src/Language/Haskell/GHC/Parser.hs
@@ -28,24 +28,36 @@
 import Data.List (intercalate, findIndex, isInfixOf)
 import Data.Char (isAlphaNum)
 
+#if MIN_VERSION_ghc(9,0,0)
+import GHC.Data.Bag
+import GHC.Driver.Session (parseDynamicFilePragma)
+import GHC.Data.FastString
+import GHC.Parser.Header (getOptions)
+import GHC.Parser.Lexer hiding (buffer)
+import GHC.Data.OrdList
+import GHC.Utils.Panic (handleGhcException)
+import qualified GHC.Types.SrcLoc as SrcLoc
+import GHC.Data.StringBuffer hiding (len)
+#else
 import Bag
 import DynFlags (parseDynamicFilePragma)
+import FastString
+import HeaderInfo (getOptions)
+import Lexer hiding (buffer)
+import OrdList
+import Panic (handleGhcException)
+import qualified SrcLoc as SrcLoc
+import StringBuffer hiding (len)
+#endif
 #if MIN_VERSION_ghc(8,10,0)
 #else
 import ErrUtils hiding (ErrMsg)
 #endif
-import FastString
 #if MIN_VERSION_ghc(8,4,0)
 import GHC hiding (Located, Parsed, parser)
 #else
 import GHC hiding (Located, parser)
 #endif
-import HeaderInfo (getOptions)
-import Lexer hiding (buffer)
-import OrdList
-import Panic (handleGhcException)
-import qualified SrcLoc as SrcLoc
-import StringBuffer hiding (len)
 
 import qualified Language.Haskell.GHC.HappyParser as Parse
 
@@ -115,9 +127,10 @@
 #endif
 parserTypeSignature = Parser Parse.fullTypeSignature
 
-#if MIN_VERSION_ghc(8,4,0)
+#if MIN_VERSION_ghc(9,0,0)
+parserModule :: Parser (SrcLoc.Located HsModule)
+#elif MIN_VERSION_ghc(8,4,0)
 parserModule :: Parser (SrcLoc.Located (HsModule GhcPs))
-
 #else
 parserModule :: Parser (SrcLoc.Located (HsModule RdrName))
 #endif
@@ -136,7 +149,14 @@
     toParseOut $ unP parser parseState
   where
     toParseOut :: ParseResult a -> ParseOutput a
-#if MIN_VERSION_ghc(8,10,0)
+#if MIN_VERSION_ghc(9,0,0)
+    toParseOut (PFailed pstate) =
+      let realSpan = SrcLoc.psRealSpan $ last_loc pstate
+          errMsg = printErrorBag $ snd $ (messages pstate) flags
+          ln = srcLocLine $ SrcLoc.realSrcSpanStart realSpan
+          col = srcLocCol $ SrcLoc.realSrcSpanStart realSpan
+        in Failure errMsg $ Loc ln col
+#elif MIN_VERSION_ghc(8,10,0)
     toParseOut (PFailed pstate) =
       let realSpan = last_loc pstate
           errMsg = printErrorBag $ snd $ (messages pstate) flags
diff --git a/ghc-parser.cabal b/ghc-parser.cabal
--- a/ghc-parser.cabal
+++ b/ghc-parser.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                ghc-parser
-version:             0.2.2.0
+version:             0.2.3.0
 synopsis:            Haskell source parser from GHC.
 -- description:
 homepage:            https://github.com/gibiansky/IHaskell
@@ -14,7 +14,7 @@
 category:            Language
 build-type:          Simple
 -- extra-source-files:
-cabal-version:       >=1.16
+cabal-version:       1.16
 
 library
   build-tools:         happy, cpphs
@@ -24,7 +24,7 @@
   -- other-modules:
   -- other-extensions:
   build-depends:       base                 >=4.9 && < 5,
-                       ghc                  >=8.0 && <8.11
+                       ghc                  >=8.0 && <9.1
 
   if impl(ghc >= 8.0) && impl(ghc < 8.4)
     hs-source-dirs:    generic-src src-8.0
@@ -32,7 +32,10 @@
     if impl(ghc >= 8.4) && impl(ghc < 8.10)
       hs-source-dirs:  generic-src src-8.4
     else
-      hs-source-dirs:  generic-src src-8.10
+      if impl(ghc >= 8.10) && impl(ghc < 9.0)
+        hs-source-dirs:  generic-src src-8.10
+      else
+        hs-source-dirs:  generic-src src-9.0
 
 
   default-language:    Haskell2010
diff --git a/src-9.0/Language/Haskell/GHC/HappyParser.hs b/src-9.0/Language/Haskell/GHC/HappyParser.hs
new file mode 100644
--- /dev/null
+++ b/src-9.0/Language/Haskell/GHC/HappyParser.hs
@@ -0,0 +1,40 @@
+module Language.Haskell.GHC.HappyParser
+    ( fullStatement
+    , fullImport
+    , fullDeclaration
+    , fullExpression
+    , fullTypeSignature
+    , fullModule
+    ) where
+
+import GHC.Parser
+import GHC.Types.SrcLoc
+
+-- compiler/hsSyn
+import GHC.Hs
+
+-- compiler/utils
+import GHC.Data.OrdList
+
+-- compiler/parser
+import GHC.Parser.Lexer
+
+import GHC.Parser.PostProcess (runECP_P)
+
+fullStatement :: P (Maybe (LStmt GhcPs (LHsExpr GhcPs)))
+fullStatement = parseStmt
+
+fullImport :: P (LImportDecl GhcPs)
+fullImport = parseImport
+
+fullDeclaration :: P (OrdList (LHsDecl GhcPs))
+fullDeclaration = fmap unitOL parseDeclaration
+
+fullExpression :: P (LHsExpr GhcPs)
+fullExpression = runECP_P =<< parseExpression
+
+fullTypeSignature :: P (Located (OrdList (LHsDecl GhcPs)))
+fullTypeSignature = fmap (noLoc . unitOL) parseTypeSignature
+
+fullModule :: P (Located HsModule)
+fullModule = parseModule
