diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -6,11 +6,16 @@
 and this project adheres to the
 [Haskell Package Versioning Policy](https://pvp.haskell.org/).
 
+## 0.1.4.0 - 2023-04-28
+
+* Add further support for GHC 9.4 (GHC 9.4.5 onward) and support for GHC 9.6.
+  See [#14](https://github.com/commercialhaskell/hi-file-parser/pull/14)
+
 ## 0.1.3.0 - 2022-08-12
 
 * Allow dependency on `mtl` >= 2.3. See
   [#6](https://github.com/commercialhaskell/hi-file-parser/pull/6)
-* Add support for GHC 9.4. See
+* Add support for GHC 9.4 (up to GHC 9.4.4). See
   [#7](https://github.com/commercialhaskell/hi-file-parser/pull/7)
 
 ## 0.1.2.0 - 2021-04-09
diff --git a/hi-file-parser.cabal b/hi-file-parser.cabal
--- a/hi-file-parser.cabal
+++ b/hi-file-parser.cabal
@@ -1,11 +1,11 @@
-cabal-version: 1.12
+cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.0.
+-- This file has been generated from package.yaml by hpack version 0.35.2.
 --
 -- see: https://github.com/sol/hpack
 
 name:           hi-file-parser
-version:        0.1.3.0
+version:        0.1.4.0
 synopsis:       Parser for GHC's hi files
 description:    Please see the README on Github at <https://github.com/commercialhaskell/hi-file-parser/blob/master/README.md>
 category:       Development
@@ -19,26 +19,30 @@
 extra-source-files:
     README.md
     ChangeLog.md
-    test-files/iface/x64/ghc844/Main.hi
-    test-files/iface/x64/ghc844/X.hi
-    test-files/iface/x64/ghc822/Main.hi
-    test-files/iface/x64/ghc822/X.hi
-    test-files/iface/x64/ghc864/Main.hi
-    test-files/iface/x64/ghc864/X.hi
-    test-files/iface/x64/ghc884/Main.hi
-    test-files/iface/x64/ghc884/X.hi
-    test-files/iface/x64/ghc8104/Main.hi
-    test-files/iface/x64/ghc8104/X.hi
-    test-files/iface/x64/ghc901/Main.hi
-    test-files/iface/x64/ghc901/X.hi
-    test-files/iface/x64/ghc9023/Main.hi
-    test-files/iface/x64/ghc9023/X.hi
-    test-files/iface/x64/ghc9041/Main.hi
-    test-files/iface/x64/ghc9041/X.hi
-    test-files/iface/x32/ghc844/Main.hi
-    test-files/iface/x32/ghc802/Main.hi
     test-files/iface/x32/ghc7103/Main.hi
-    test-files/iface/x32/ghc822/Main.hi
+    test-files/iface/x32/ghc8002/Main.hi
+    test-files/iface/x32/ghc8022/Main.hi
+    test-files/iface/x32/ghc8044/Main.hi
+    test-files/iface/x64/ghc8022/Main.hi
+    test-files/iface/x64/ghc8022/X.hi
+    test-files/iface/x64/ghc8044/Main.hi
+    test-files/iface/x64/ghc8044/X.hi
+    test-files/iface/x64/ghc8065/Main.hi
+    test-files/iface/x64/ghc8065/X.hi
+    test-files/iface/x64/ghc8084/Main.hi
+    test-files/iface/x64/ghc8084/X.hi
+    test-files/iface/x64/ghc8107/Main.hi
+    test-files/iface/x64/ghc8107/X.hi
+    test-files/iface/x64/ghc9002/Main.hi
+    test-files/iface/x64/ghc9002/X.hi
+    test-files/iface/x64/ghc9027/Main.hi
+    test-files/iface/x64/ghc9027/X.hi
+    test-files/iface/x64/ghc9044/Main.hi
+    test-files/iface/x64/ghc9044/X.hi
+    test-files/iface/x64/ghc9045/Main.hi
+    test-files/iface/x64/ghc9045/X.hi
+    test-files/iface/x64/ghc9061/Main.hi
+    test-files/iface/x64/ghc9061/X.hi
 
 source-repository head
   type: git
diff --git a/src/HiFileParser.hs b/src/HiFileParser.hs
--- a/src/HiFileParser.hs
+++ b/src/HiFileParser.hs
@@ -63,6 +63,7 @@
   | V8101
   | V9001
   | V9041
+  | V9045
   deriving (Show,Eq,Ord,Enum)
   -- careful, the Ord matters!
 
@@ -205,6 +206,10 @@
     traceGet ("Dictionary: " ++ show dict)
     return dict
 
+-- | Get a FastString
+--
+-- FastStrings are stored in a global FastString table and only the index (a
+-- Word32be) is stored at the expected position.
 getCachedBS :: Dictionary -> Get ByteString
 getCachedBS d = go =<< traceShow "Dict index:" getWord32be
   where
@@ -515,6 +520,8 @@
     dusage <- traceShow "Usage:"        getUsage
     pure (Interface ddeps dusage)
   where
+    since v = when (version >= v)
+
     getModule = do
         idType <- traceShow "Unit type:" getWord8
         case idType of
@@ -566,40 +573,42 @@
 
     getUsage = withBlockPrefix $ List . catMaybes . unList <$> getList go
       where
+        -- this must follow the `Binary Usage` instance in GHC
+        -- (in GHC.Unit.Module.Deps, at least in GHC 9.4.5)
         go :: Get (Maybe Usage)
         go = do
             usageType <- traceShow "Usage type:" getWord8
             case usageType of
                 0 -> do
-                  void (traceShow "Module:" getModule)
-                  void getFP
-                  void getBool
+                  void (traceShow "Module:" getModule) -- usg_mod
+                  void getFP                           -- usg_mod_hash
+                  void getBool                         -- usg_safe
                   pure Nothing
 
                 1 -> do
-                    void (traceShow "Home module:" (getCachedBS d))
-                    void getFP
-                    void (getMaybe getFP)
-                    void (getList (getTuple (getWord8 *> getCachedBS d) getFP))
-                    void getBool
+                    void (traceShow "Home module:" (getCachedBS d)) -- usg_mod_name
+                    since V9045 $ void (getCachedBS d)              -- usg_unit_id
+                    void getFP                                      -- usg_mod_hash
+                    void (getMaybe getFP)                           -- usg_exports
+                    void (getList (getTuple (getWord8 *> getCachedBS d) getFP)) -- usg_entities
+                    void getBool                                    -- usg_safe
                     pure Nothing
 
                 2 -> do
-                  file_path  <- traceShow "File:" getString
-                  _file_hash <- traceShow "FP:" getFP'
-                  when (version >= V9041) $ do
-                    _file_label <- traceShow "File label:" (getMaybe getString)
-                    pure ()
+                  file_path  <- traceShow "File:" getString         -- usg_file_path
+                  void $ traceShow "FP:" getFP'                     -- usg_file_hash
+                  since V9041 $ void $ traceShow "File label:" (getMaybe getString)-- usg_file_label
                   pure (Just (Usage file_path))
 
                 3 -> do
-                  void getModule
-                  void getFP
+                  void getModule -- usg_mod
+                  void getFP     -- usg_mod_hash
                   pure Nothing
 
                 4 | version >= V9041 -> do -- UsageHomeModuleInterface
-                  _mod_name   <- void (getCachedBS d)
-                  _iface_hash <- void getFP
+                  void (getCachedBS d)                -- usg_mod_name
+                  since V9045 $ void (getCachedBS d)  -- usg_unit_id
+                  void getFP                          -- usg_iface_hash
                   pure Nothing
 
                 _ -> fail $ "Invalid usageType: " <> show usageType
@@ -641,6 +650,7 @@
     traceGet ("Version: " ++ version)
 
     let !ifaceVersion
+          | version >= "9045" = V9045
           | version >= "9041" = V9041
           | version >= "9001" = V9001
           | version >= "8101" = V8101
@@ -675,6 +685,7 @@
     void getPtr
 
     case ifaceVersion of
+      V9045 -> getInterfaceRecent ifaceVersion dict
       V9041 -> getInterfaceRecent ifaceVersion dict
       V9001 -> getInterfaceRecent ifaceVersion dict
       V8101 -> getInterfaceRecent ifaceVersion dict
diff --git a/test-files/iface/x32/ghc8002/Main.hi b/test-files/iface/x32/ghc8002/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x32/ghc8002/Main.hi differ
diff --git a/test-files/iface/x32/ghc802/Main.hi b/test-files/iface/x32/ghc802/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x32/ghc802/Main.hi and /dev/null differ
diff --git a/test-files/iface/x32/ghc8022/Main.hi b/test-files/iface/x32/ghc8022/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x32/ghc8022/Main.hi differ
diff --git a/test-files/iface/x32/ghc8044/Main.hi b/test-files/iface/x32/ghc8044/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x32/ghc8044/Main.hi differ
diff --git a/test-files/iface/x32/ghc822/Main.hi b/test-files/iface/x32/ghc822/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x32/ghc822/Main.hi and /dev/null differ
diff --git a/test-files/iface/x32/ghc844/Main.hi b/test-files/iface/x32/ghc844/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x32/ghc844/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc8022/Main.hi b/test-files/iface/x64/ghc8022/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8022/Main.hi differ
diff --git a/test-files/iface/x64/ghc8022/X.hi b/test-files/iface/x64/ghc8022/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8022/X.hi differ
diff --git a/test-files/iface/x64/ghc8044/Main.hi b/test-files/iface/x64/ghc8044/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8044/Main.hi differ
diff --git a/test-files/iface/x64/ghc8044/X.hi b/test-files/iface/x64/ghc8044/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8044/X.hi differ
diff --git a/test-files/iface/x64/ghc8065/Main.hi b/test-files/iface/x64/ghc8065/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8065/Main.hi differ
diff --git a/test-files/iface/x64/ghc8065/X.hi b/test-files/iface/x64/ghc8065/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8065/X.hi differ
diff --git a/test-files/iface/x64/ghc8084/Main.hi b/test-files/iface/x64/ghc8084/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8084/Main.hi differ
diff --git a/test-files/iface/x64/ghc8084/X.hi b/test-files/iface/x64/ghc8084/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8084/X.hi differ
diff --git a/test-files/iface/x64/ghc8104/Main.hi b/test-files/iface/x64/ghc8104/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc8104/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc8104/X.hi b/test-files/iface/x64/ghc8104/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc8104/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc8107/Main.hi b/test-files/iface/x64/ghc8107/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8107/Main.hi differ
diff --git a/test-files/iface/x64/ghc8107/X.hi b/test-files/iface/x64/ghc8107/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc8107/X.hi differ
diff --git a/test-files/iface/x64/ghc822/Main.hi b/test-files/iface/x64/ghc822/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc822/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc822/X.hi b/test-files/iface/x64/ghc822/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc822/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc844/Main.hi b/test-files/iface/x64/ghc844/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc844/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc844/X.hi b/test-files/iface/x64/ghc844/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc844/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc864/Main.hi b/test-files/iface/x64/ghc864/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc864/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc864/X.hi b/test-files/iface/x64/ghc864/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc864/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc884/Main.hi b/test-files/iface/x64/ghc884/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc884/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc884/X.hi b/test-files/iface/x64/ghc884/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc884/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9002/Main.hi b/test-files/iface/x64/ghc9002/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9002/Main.hi differ
diff --git a/test-files/iface/x64/ghc9002/X.hi b/test-files/iface/x64/ghc9002/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9002/X.hi differ
diff --git a/test-files/iface/x64/ghc901/Main.hi b/test-files/iface/x64/ghc901/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc901/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc901/X.hi b/test-files/iface/x64/ghc901/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc901/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9023/Main.hi b/test-files/iface/x64/ghc9023/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc9023/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9023/X.hi b/test-files/iface/x64/ghc9023/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc9023/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9027/Main.hi b/test-files/iface/x64/ghc9027/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9027/Main.hi differ
diff --git a/test-files/iface/x64/ghc9027/X.hi b/test-files/iface/x64/ghc9027/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9027/X.hi differ
diff --git a/test-files/iface/x64/ghc9041/Main.hi b/test-files/iface/x64/ghc9041/Main.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc9041/Main.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9041/X.hi b/test-files/iface/x64/ghc9041/X.hi
deleted file mode 100644
Binary files a/test-files/iface/x64/ghc9041/X.hi and /dev/null differ
diff --git a/test-files/iface/x64/ghc9044/Main.hi b/test-files/iface/x64/ghc9044/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9044/Main.hi differ
diff --git a/test-files/iface/x64/ghc9044/X.hi b/test-files/iface/x64/ghc9044/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9044/X.hi differ
diff --git a/test-files/iface/x64/ghc9045/Main.hi b/test-files/iface/x64/ghc9045/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9045/Main.hi differ
diff --git a/test-files/iface/x64/ghc9045/X.hi b/test-files/iface/x64/ghc9045/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9045/X.hi differ
diff --git a/test-files/iface/x64/ghc9061/Main.hi b/test-files/iface/x64/ghc9061/Main.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9061/Main.hi differ
diff --git a/test-files/iface/x64/ghc9061/X.hi b/test-files/iface/x64/ghc9061/X.hi
new file mode 100644
Binary files /dev/null and b/test-files/iface/x64/ghc9061/X.hi differ
diff --git a/test/HiFileParserSpec.hs b/test/HiFileParserSpec.hs
--- a/test/HiFileParserSpec.hs
+++ b/test/HiFileParserSpec.hs
@@ -14,24 +14,28 @@
 type Usage = String
 type Module = ByteString
 
+-- | GHC x.y.z is represented as \"ghcxyyz\" where yy is padded with zeros.
 versions32 :: [Version]
 versions32 =
-  [ "ghc7103"
-  , "ghc802"
-  , "ghc822"
-  , "ghc844"
+  [ "ghc7103"  -- Last in GHC 7.10 series, using GHC 7.8.1 format
+  , "ghc8002"  -- Last in GHC 8.0 series, using GHC 8.0.1 format
+  , "ghc8022"  -- Last in GHC 8.2 series, using GHC 8.2.1 format
+  , "ghc8044"  -- Last in GHC 8.4 series, using GHC 8.4.1 format
   ]
 
+-- | GHC x.y.z is represented as \"ghcxyyz\" where yy is padded with zeros.
 versions64 :: [Version]
 versions64 =
-  [ "ghc822"
-  , "ghc844"
-  , "ghc864"
-  , "ghc884"
-  , "ghc8104"
-  , "ghc901"
-  , "ghc9023"
-  , "ghc9041"
+  [ "ghc8022"  -- Last in GHC 8.2 series, using GHC 8.0.1 format
+  , "ghc8044"  -- Last in GHC 8.4 series, using GHC 8.4.1 format
+  , "ghc8065"  -- Last in GHC 8.6 series, using GHC 8.6.1 format
+  , "ghc8084"  -- Last in GHC 8.8 series, using GHC 8.6.1 format
+  , "ghc8107"  -- Last in GHC 8.10 series, using GHC 8.10.1 format
+  , "ghc9002"  -- Last in GHC 9.0 series, using GHC 9.0.1 format
+  , "ghc9027"  -- Last in GHC 9.2 series, using GHC 9.0.1 format
+  , "ghc9044"  -- Last using GHC 9.4.1 format
+  , "ghc9045"  -- First using GHC 9.4.5 format; last in GHC 9.4 series
+  , "ghc9061"  -- Last in GHC 9.6 series, using GHC 9.4.5 format
   ]
 
 spec :: Spec
