diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,62 @@
 # Changelog for haskell-language-server
 
+## 2.3.0.0.0
+
+* Binaries for GHC 9.6.3
+* Drop support for GHC 8.10
+* Remove `hls-haddock-comments-plugin`, `hls-stan-plugin`, and `hls-tactics-plugin`
+* Don't suggest bogus modules names in `hls-module-name-plugin` (#3784)
+* Add support for external Ormolu (#3771)
+* Improve refine imports behaviour for qualified imports (#3806)
+
+### Pull Requests
+
+- Switch chat room to matrix
+  ([#3817](https://github.com/haskell/haskell-language-server/pull/3817)) by @July541
+- Fix flaky hie bios test
+  ([#3814](https://github.com/haskell/haskell-language-server/pull/3814)) by @fendor
+- Revert "Bump actions/checkout from 3 to 4"
+  ([#3813](https://github.com/haskell/haskell-language-server/pull/3813)) by @wz1000
+- Add test directories to hls-retrie-plugin
+  ([#3808](https://github.com/haskell/haskell-language-server/pull/3808)) by @Vekhir
+- Change refine imports behaviour for qualified imports
+  ([#3806](https://github.com/haskell/haskell-language-server/pull/3806)) by @joyfulmantis
+- Update links to Nix documentation
+  ([#3805](https://github.com/haskell/haskell-language-server/pull/3805)) by @maralorn
+- Bump actions/checkout from 3 to 4
+  ([#3802](https://github.com/haskell/haskell-language-server/pull/3802)) by @dependabot[bot]
+- Bump cachix/install-nix-action from 22 to 23
+  ([#3801](https://github.com/haskell/haskell-language-server/pull/3801)) by @dependabot[bot]
+- Add support for Fourmolu 0.14.0.0
+  ([#3796](https://github.com/haskell/haskell-language-server/pull/3796)) by @brandonchinn178
+- Add code lens  and fix code actions experiments
+  ([#3791](https://github.com/haskell/haskell-language-server/pull/3791)) by @joyfulmantis
+- Bump lsp versions in flake
+  ([#3790](https://github.com/haskell/haskell-language-server/pull/3790)) by @colonelpanic8
+- Clean up Release CI
+  ([#3787](https://github.com/haskell/haskell-language-server/pull/3787)) by @fendor
+- Do not suggest bogus module names
+  ([#3784](https://github.com/haskell/haskell-language-server/pull/3784)) by @Bodigrim
+- Delete `hls-haddock-comments-plugin`, `hls-stan-plugin`, and `hls-tactics-plugin`
+  ([#3782](https://github.com/haskell/haskell-language-server/pull/3782)) by @michaelpj
+- Enhance/releasing checklist
+  ([#3781](https://github.com/haskell/haskell-language-server/pull/3781)) by @fendor
+- Add cradle dependencies to session loading errors
+  ([#3779](https://github.com/haskell/haskell-language-server/pull/3779)) by @VeryMilkyJoe
+- Prepare release 2.2.0.0
+  ([#3775](https://github.com/haskell/haskell-language-server/pull/3775)) by @fendor
+- Add support for external Ormolu
+  ([#3771](https://github.com/haskell/haskell-language-server/pull/3771)) by @sir4ur0n
+- Support for resolve for class-plugin lenses
+  ([#3769](https://github.com/haskell/haskell-language-server/pull/3769)) by @joyfulmantis
+- Introduce declarative test project definition for plugin tests
+  ([#3767](https://github.com/haskell/haskell-language-server/pull/3767)) by @fendor
+- Use latest version of fourmolu possible
+  ([#3764](https://github.com/haskell/haskell-language-server/pull/3764)) by @brandonchinn178
+- Drop support for GHC 8.10
+  ([#3434](https://github.com/haskell/haskell-language-server/pull/3434)) by @michaelpj
+
+
 ## 2.2.0.0
 
 * Binaries for GHC 9.4.7
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
 [![CircleCI][badge-circleci]][circleci]
 [![GitHub Testing Workflow](https://github.com/haskell/haskell-language-server/actions/workflows/test.yml/badge.svg)](https://github.com/haskell/haskell-language-server/actions/workflows/test.yml)
 [![GitHub Nix Workflow](https://github.com/haskell/haskell-language-server/actions/workflows/nix.yml/badge.svg)](https://github.com/haskell/haskell-language-server/actions/workflows/nix.yml)
-[![ircchat][badge-ircchat]][ircchat]
+[![matrix][badge-matrix]][matrix]
 [![codetriage][badge-codetriage]][codetriage]
 
 [logo]: ./docs/logos/logo-256.png
@@ -22,8 +22,8 @@
 [hackage]: https://hackage.haskell.org/package/haskell-language-server
 [badge-codetriage]: https://www.codetriage.com/haskell/haskell-language-server/badges/users.svg
 [codetriage]:https://www.codetriage.com/haskell/haskell-language-server
-[badge-ircchat]:https://img.shields.io/badge/chat-on%20libera-brightgreen.svg
-[ircchat]:https://web.libera.chat/?channels=#haskell-language-server
+[badge-matrix]:https://img.shields.io/badge/chat-on%20matrix-brightgreen.svg
+[matrix]:https://matrix.to/#/#haskell-language-server:matrix.org
 [github-release]:https://github.com/haskell/haskell-language-server/releases/latest
 
 The official Haskell language server (LSP) implementation. Consult the [project documentation](https://haskell-language-server.readthedocs.io/en/latest/) for more details.
diff --git a/haskell-language-server.cabal b/haskell-language-server.cabal
--- a/haskell-language-server.cabal
+++ b/haskell-language-server.cabal
@@ -1,7 +1,7 @@
 cabal-version:      3.0
 category:           Development
 name:               haskell-language-server
-version:            2.2.0.0
+version:            2.3.0.0
 synopsis:           LSP server for GHC
 description:
   Please see the README on GitHub at <https://github.com/haskell/haskell-language-server#readme>
@@ -14,7 +14,7 @@
 license:            Apache-2.0
 license-file:       LICENSE
 build-type:         Simple
-tested-with:        GHC == 8.10.7 || == 9.0.2 || ==9.2.5
+tested-with:        GHC == 9.0.2 || ==9.2.5
 extra-source-files:
   README.md
   ChangeLog.md
@@ -79,11 +79,6 @@
   default:     True
   manual:      True
 
-flag haddockComments
-  description: Enable haddockComments plugin
-  default:     True
-  manual:      True
-
 flag eval
   description: Enable eval plugin
   default:     True
@@ -104,21 +99,11 @@
   default:     True
   manual:      True
 
-flag tactic
-  description: Enable tactic plugin
-  default:     True
-  manual:      True
-
 flag hlint
   description: Enable hlint plugin
   default:     True
   manual:      True
 
-flag stan
-  description: Enable stan plugin
-  default:     True
-  manual:      True
-
 flag moduleName
   description: Enable moduleName plugin
   default:     True
@@ -213,144 +198,129 @@
 
 common cabalfmt
   if flag(cabalfmt)
-    build-depends: hls-cabal-fmt-plugin == 2.2.0.0
+    build-depends: hls-cabal-fmt-plugin == 2.3.0.0
     cpp-options: -Dhls_cabalfmt
 
 common cabal
   if flag(cabal)
-    build-depends: hls-cabal-plugin == 2.2.0.0
+    build-depends: hls-cabal-plugin == 2.3.0.0
     cpp-options: -Dhls_cabal
 
 common class
   if flag(class)
-    build-depends: hls-class-plugin == 2.2.0.0
+    build-depends: hls-class-plugin == 2.3.0.0
     cpp-options: -Dhls_class
 
 common callHierarchy
   if flag(callHierarchy)
-    build-depends: hls-call-hierarchy-plugin == 2.2.0.0
+    build-depends: hls-call-hierarchy-plugin == 2.3.0.0
     cpp-options: -Dhls_callHierarchy
 
-common haddockComments
-  if flag(haddockComments) && (impl(ghc < 9.2.1) || flag(ignore-plugins-ghc-bounds))
-    build-depends: hls-haddock-comments-plugin == 2.2.0.0
-    cpp-options: -Dhls_haddockComments
-
 common eval
   if flag(eval)
-    build-depends: hls-eval-plugin == 2.2.0.0
+    build-depends: hls-eval-plugin == 2.3.0.0
     cpp-options: -Dhls_eval
 
 common importLens
   if flag(importLens)
-    build-depends: hls-explicit-imports-plugin == 2.2.0.0
+    build-depends: hls-explicit-imports-plugin == 2.3.0.0
     cpp-options: -Dhls_importLens
 
 common rename
   if flag(rename)
-    build-depends: hls-rename-plugin == 2.2.0.0
+    build-depends: hls-rename-plugin == 2.3.0.0
     cpp-options: -Dhls_rename
 
 common retrie
   if flag(retrie)
-    build-depends: hls-retrie-plugin == 2.2.0.0
+    build-depends: hls-retrie-plugin == 2.3.0.0
     cpp-options: -Dhls_retrie
 
-common tactic
-  if flag(tactic) && (impl(ghc < 9.2.1) || flag(ignore-plugins-ghc-bounds))
-    build-depends: hls-tactics-plugin == 2.2.0.0
-    cpp-options: -Dhls_tactic
-
 common hlint
   if flag(hlint)
-    build-depends: hls-hlint-plugin == 2.2.0.0
+    build-depends: hls-hlint-plugin == 2.3.0.0
     cpp-options: -Dhls_hlint
 
-common stan
-  if flag(stan) && (impl(ghc >= 8.10) && impl(ghc < 9.0))
-    build-depends: hls-stan-plugin == 2.2.0.0
-    cpp-options: -Dhls_stan
-
 common moduleName
   if flag(moduleName)
-    build-depends: hls-module-name-plugin == 2.2.0.0
+    build-depends: hls-module-name-plugin == 2.3.0.0
     cpp-options: -Dhls_moduleName
 
 common pragmas
   if flag(pragmas)
-    build-depends: hls-pragmas-plugin == 2.2.0.0
+    build-depends: hls-pragmas-plugin == 2.3.0.0
     cpp-options: -Dhls_pragmas
 
 common splice
   if flag(splice)
-    build-depends: hls-splice-plugin == 2.2.0.0
+    build-depends: hls-splice-plugin == 2.3.0.0
     cpp-options: -Dhls_splice
 
 common alternateNumberFormat
   if flag(alternateNumberFormat)
-    build-depends: hls-alternate-number-format-plugin == 2.2.0.0
+    build-depends: hls-alternate-number-format-plugin == 2.3.0.0
     cpp-options: -Dhls_alternateNumberFormat
 
 common qualifyImportedNames
   if flag(qualifyImportedNames)
-    build-depends: hls-qualify-imported-names-plugin == 2.2.0.0
+    build-depends: hls-qualify-imported-names-plugin == 2.3.0.0
     cpp-options: -Dhls_qualifyImportedNames
 
 common codeRange
   if flag(codeRange)
-    build-depends: hls-code-range-plugin == 2.2.0.0
+    build-depends: hls-code-range-plugin == 2.3.0.0
     cpp-options: -Dhls_codeRange
 
 common changeTypeSignature
   if flag(changeTypeSignature)
-    build-depends: hls-change-type-signature-plugin == 2.2.0.0
+    build-depends: hls-change-type-signature-plugin == 2.3.0.0
     cpp-options: -Dhls_changeTypeSignature
 
 common gadt
   if flag(gadt)
-    build-depends: hls-gadt-plugin == 2.2.0.0
+    build-depends: hls-gadt-plugin == 2.3.0.0
     cpp-options: -Dhls_gadt
 
 common explicitFixity
   if flag(explicitFixity)
-    build-depends: hls-explicit-fixity-plugin == 2.2.0.0
+    build-depends: hls-explicit-fixity-plugin == 2.3.0.0
     cpp-options: -DexplicitFixity
 
 common explicitFields
   if flag(explicitFields)
-    build-depends: hls-explicit-record-fields-plugin == 2.2.0.0
+    build-depends: hls-explicit-record-fields-plugin == 2.3.0.0
     cpp-options: -DexplicitFields
 
 common overloadedRecordDot
   if flag(overloadedRecordDot) && (impl(ghc >= 9.2.0) || flag(ignore-plugins-ghc-bounds))
-    build-depends: hls-overloaded-record-dot-plugin == 2.2.0.0
+    build-depends: hls-overloaded-record-dot-plugin == 2.3.0.0
     cpp-options: -Dhls_overloaded_record_dot
 
 -- formatters
 
 common floskell
   if flag(floskell) && impl(ghc < 9.5)
-    build-depends: hls-floskell-plugin == 2.2.0.0
+    build-depends: hls-floskell-plugin == 2.3.0.0
     cpp-options: -Dhls_floskell
 
 common fourmolu
   if flag(fourmolu)
-    build-depends: hls-fourmolu-plugin == 2.2.0.0
+    build-depends: hls-fourmolu-plugin == 2.3.0.0
     cpp-options: -Dhls_fourmolu
 
 common ormolu
   if flag(ormolu) && impl(ghc < 9.7)
-    build-depends: hls-ormolu-plugin == 2.2.0.0
+    build-depends: hls-ormolu-plugin == 2.3.0.0
     cpp-options: -Dhls_ormolu
 
 common stylishHaskell
   if flag(stylishHaskell)
-    build-depends: hls-stylish-haskell-plugin == 2.2.0.0
+    build-depends: hls-stylish-haskell-plugin == 2.3.0.0
     cpp-options: -Dhls_stylishHaskell
 
 common refactor
   if flag(refactor)
-    build-depends: hls-refactor-plugin == 2.2.0.0
+    build-depends: hls-refactor-plugin == 2.3.0.0
     cpp-options: -Dhls_refactor
 
 library
@@ -364,14 +334,11 @@
                   , cabalfmt
                   , changeTypeSignature
                   , class
-                  , haddockComments
                   , eval
                   , importLens
                   , rename
                   , retrie
-                  , tactic
                   , hlint
-                  , stan
                   , moduleName
                   , pragmas
                   , splice
@@ -405,12 +372,12 @@
     , cryptohash-sha1
     , data-default
     , ghc
-    , ghcide                == 2.2.0.0
+    , ghcide                == 2.3.0.0
     , githash               >=0.1.6.1
     , lsp                   >= 2.2.0.0
     , hie-bios
     , hiedb
-    , hls-plugin-api        == 2.2.0.0
+    , hls-plugin-api        == 2.3.0.0
     , optparse-applicative
     , optparse-simple
     , process
@@ -549,7 +516,7 @@
     , lens-aeson
     , ghcide
     , ghcide-test-utils
-    , hls-test-utils == 2.2.0.0
+    , hls-test-utils == 2.3.0.0
     , lsp-types
     , aeson
     , hls-plugin-api
diff --git a/src/HlsPlugins.hs b/src/HlsPlugins.hs
--- a/src/HlsPlugins.hs
+++ b/src/HlsPlugins.hs
@@ -28,10 +28,6 @@
 import qualified Ide.Plugin.Class                  as Class
 #endif
 
-#if hls_haddockComments
-import qualified Ide.Plugin.HaddockComments        as HaddockComments
-#endif
-
 #if hls_eval
 import qualified Ide.Plugin.Eval                   as Eval
 #endif
@@ -50,18 +46,10 @@
 import qualified Ide.Plugin.Retrie                 as Retrie
 #endif
 
-#if hls_tactic
-import qualified Ide.Plugin.Tactic                 as Tactic
-#endif
-
 #if hls_hlint
 import qualified Ide.Plugin.Hlint                  as Hlint
 #endif
 
-#if hls_stan
-import qualified Ide.Plugin.Stan                   as Stan
-#endif
-
 #if hls_moduleName
 import qualified Ide.Plugin.ModuleName             as ModuleName
 #endif
@@ -165,9 +153,6 @@
       -- cabalFormattingProvider in the Default Config
       let pId = "cabal-fmt" in CabalFmt.descriptor (pluginRecorder pId) pId:
 #endif
-#if hls_tactic
-      let pId = "tactics" in Tactic.descriptor (pluginRecorder pId) pId:
-#endif
 #if hls_ormolu
       let pId = "ormolu" in Ormolu.descriptor (pluginRecorder pId) pId :
 #endif
@@ -186,9 +171,6 @@
 #if hls_class
       let pId = "class" in Class.descriptor (pluginRecorder pId) pId:
 #endif
-#if hls_haddockComments
-      let pId = "haddockComments" in HaddockComments.descriptor (pluginRecorder pId) pId:
-#endif
 #if hls_eval
       let pId = "eval" in Eval.descriptor (pluginRecorder pId) pId:
 #endif
@@ -203,9 +185,6 @@
 #endif
 #if hls_hlint
       let pId = "hlint" in Hlint.descriptor (pluginRecorder pId) pId:
-#endif
-#if hls_stan
-      let pId = "stan" in Stan.descriptor (pluginRecorder pId) pId :
 #endif
 #if hls_splice
       Splice.descriptor "splice" :
diff --git a/test/functional/Completion.hs b/test/functional/Completion.hs
--- a/test/functional/Completion.hs
+++ b/test/functional/Completion.hs
@@ -377,4 +377,4 @@
     @? "Should not contain completion: " ++ show lbl
 
 expectFailIfBeforeGhc92 :: String -> TestTree -> TestTree
-expectFailIfBeforeGhc92 = knownBrokenForGhcVersions [GHC810, GHC90]
+expectFailIfBeforeGhc92 = knownBrokenForGhcVersions [GHC90]
diff --git a/test/functional/FunctionalBadProject.hs b/test/functional/FunctionalBadProject.hs
--- a/test/functional/FunctionalBadProject.hs
+++ b/test/functional/FunctionalBadProject.hs
@@ -2,37 +2,27 @@
 
 module FunctionalBadProject (tests) where
 
--- import           Control.Lens hiding (List)
--- import           Control.Monad.IO.Class
--- import qualified Data.Text as T
--- import           Language.LSP.Test hiding (message)
--- import           Language.LSP.Types as LSP
--- import           Language.LSP.Types.Lens as LSP hiding (contents, error )
+import           Control.Lens
+import qualified Data.Text                  as T
+import qualified Language.LSP.Protocol.Lens as L
 import           Test.Hls
+import           Test.Hls.Command
 
--- ---------------------------------------------------------------------
--- TODO: Currently this can not succeed, since such an error is thrown in "runActionWithContext" which
--- can produce diagnostics at the moment. Needs more investigation
--- TODO: @fendor: Add issue link here
---
+
 tests :: TestTree
-tests = testGroup "behaviour on malformed projects" [
-    testCase "no test executed" $ True @?= True
+tests = testGroup "behaviour on malformed projects"
+    [ testCase "Missing module diagnostic" $ do
+        runSession hlsCommand fullCaps "test/testdata/missingModuleTest/missingModule/" $ do
+            doc <- openDoc "src/MyLib.hs" "haskell"
+            [diag] <- waitForDiagnosticsFrom doc
+            liftIO $ assertBool "missing module name" $ "MyLib" `T.isInfixOf` (diag ^. L.message)
+            liftIO $ assertBool  "module missing context" $ "may not be listed" `T.isInfixOf` (diag ^. L.message)
+    , testCase "Missing module diagnostic - no matching prefix" $ do
+        runSession hlsCommand fullCaps "test/testdata/missingModuleTest/noPrefixMatch/" $ do
+            doc <- openDoc "app/Other.hs" "haskell"
+            [diag] <- waitForDiagnosticsFrom doc
+            liftIO $ assertBool "missing module name" $
+                "Other" `T.isInfixOf` (diag ^. L.message)
+            liftIO $ assertBool  "hie-bios message" $
+                "Cabal {component = Just \"exe:testExe\"}" `T.isInfixOf` (diag ^. L.message)
     ]
-
-    -- testCase "deals with cabal file with unsatisfiable dependency" $
-    --     runSession hlsCommandExamplePlugin codeActionSupportCaps "test/testdata/badProjects/cabal" $ do
-    --         _doc <- openDoc "Foo.hs" "haskell"
-
-    --         diags@(d:_) <- waitForDiagnosticsSource "bios"
-    --         -- liftIO $ show diags @?= ""
-    --         -- liftIO $ putStrLn $ show diags
-    --         -- liftIO $ putStrLn "a"
-    --         liftIO $ do
-    --             length diags @?= 1
-    --             d ^. range @?= Range (Position 0 0) (Position 1 0)
-    --             d ^. severity @?= (Just DsError)
-    --             d ^. code @?= Nothing
-    --             d ^. source @?= Just "bios"
-    --             d ^. message @?=
-    --                 (T.pack "readCreateProcess: stack \"build\" \"--only-configure\" \".\" (exit 1): failed\n")
diff --git a/test/functional/FunctionalCodeAction.hs b/test/functional/FunctionalCodeAction.hs
--- a/test/functional/FunctionalCodeAction.hs
+++ b/test/functional/FunctionalCodeAction.hs
@@ -8,7 +8,6 @@
 import           Control.Monad
 import           Data.Aeson.Lens              (_Object)
 import           Data.List
-import qualified Data.Map                     as M
 import           Data.Maybe
 import qualified Data.Text                    as T
 import           Development.IDE.Core.Compile (sourceTypecheck)
@@ -307,16 +306,6 @@
                     , "foo x = maxBound"
                     ]
 
-      , knownBrokenForGhcVersions [GHC92, GHC94, GHC96] "The wingman plugin doesn't yet compile in GHC92/GHC94" $
-          testCase "doesn't work when wingman is active" $
-          runSession hlsCommand fullCaps "test/testdata" $ do
-              doc <- openDoc "TypedHoles.hs" "haskell"
-              _ <- waitForDiagnosticsFromSource doc (T.unpack sourceTypecheck)
-              cas <- getAllCodeActions doc
-              liftIO $ do
-                  dontExpectCodeAction cas ["replace _ with minBound"]
-                  dontExpectCodeAction cas ["replace _ with foo _"]
-
       , testCase "shows more suggestions" $
             runSessionWithConfig (def {lspConfig = hlsConfigToClientConfig testConfig}) hlsCommand fullCaps "test/testdata" $ do
                 doc <- openDoc "TypedHoles2.hs" "haskell"
@@ -340,17 +329,6 @@
                         , "  where"
                         , "    stuff (A a) = A (a + 1)"
                         ]
-
-      , knownBrokenForGhcVersions [GHC92, GHC94, GHC96] "The wingman plugin doesn't yet compile in GHC92/GHC94" $
-          testCase "doesnt show more suggestions when wingman is active" $
-            runSession hlsCommand fullCaps "test/testdata" $ do
-                doc <- openDoc "TypedHoles2.hs" "haskell"
-                _ <- waitForDiagnosticsFromSource doc (T.unpack sourceTypecheck)
-                cas <- getAllCodeActions doc
-
-                liftIO $ do
-                    dontExpectCodeAction cas ["replace _ with foo2 _"]
-                    dontExpectCodeAction cas ["replace _ with A _"]
     ]
 
 signatureTests :: TestTree
@@ -433,7 +411,6 @@
 testConfig :: Config
 testConfig = def {
   formattingProvider = "none"
-  , plugins = M.insert "tactics" (def { plcGlobalOn = False }) (plugins def)
   }
 
 
diff --git a/test/functional/HieBios.hs b/test/functional/HieBios.hs
--- a/test/functional/HieBios.hs
+++ b/test/functional/HieBios.hs
@@ -5,32 +5,15 @@
 import           Control.Monad.IO.Class
 import qualified Data.Text                  as T
 import qualified Language.LSP.Protocol.Lens as L
-import           System.FilePath            ((</>))
 import           Test.Hls
 import           Test.Hls.Command
 
-
 tests :: TestTree
-tests = testGroup "hie-bios" [
-    testCase "loads modules inside main-is" $ do
-        writeFile (hieBiosErrorPath </> "hie.yaml") ""
-        runSession hlsCommand fullCaps "test/testdata/hieBiosMainIs" $ do
-            doc <- openDoc "Main.hs" "haskell"
-            Just mainHoverText <- getHover doc (Position 3 1)
-            let hoverContents = mainHoverText ^. L.contents
-            case hoverContents of
-                 (InL (MarkupContent _ x)) -> do
-                    liftIO $ "main :: IO ()" `T.isInfixOf` x
-                            @? "found hover text for main"
-                 _ -> error $ "Unexpected hover contents: " ++ show hoverContents
-
-    , expectFailBecause "hie-bios 0.11 has poor error messages" $ testCase "reports errors in hie.yaml" $ do
-        writeFile (hieBiosErrorPath </> "hie.yaml") ""
-        runSession hlsCommand fullCaps hieBiosErrorPath $ do
-            _ <- openDoc "Foo.hs" "haskell"
-            (diag:_) <- waitForDiagnostics
-            liftIO $ "Expected a cradle: key containing the preferences" `T.isInfixOf` (diag ^. L.message)
-                     @? "Error reported"
-    ]
-    where
-        hieBiosErrorPath = "test/testdata/hieBiosError"
+tests = testGroup "hie-bios"
+  [ testCase "loads main-is module" $ do
+    runSession hlsCommand fullCaps "test/testdata/hieBiosMainIs" $ do
+      _ <- openDoc "Main.hs" "haskell"
+      (diag:_) <- waitForDiagnostics
+      liftIO $ "Top-level binding with no type signature:" `T.isInfixOf` (diag ^. L.message)
+        @? "Expected missing top-level binding diagnostic"
+  ]
diff --git a/test/testdata/hieBiosError/Foo.hs b/test/testdata/hieBiosError/Foo.hs
deleted file mode 100644
--- a/test/testdata/hieBiosError/Foo.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-main = putStrLn "hey"
diff --git a/test/testdata/hieBiosError/hie.yaml b/test/testdata/hieBiosError/hie.yaml
deleted file mode 100644
--- a/test/testdata/hieBiosError/hie.yaml
+++ /dev/null
diff --git a/test/testdata/hieBiosMainIs/Main.hs b/test/testdata/hieBiosMainIs/Main.hs
--- a/test/testdata/hieBiosMainIs/Main.hs
+++ b/test/testdata/hieBiosMainIs/Main.hs
@@ -1,4 +1,6 @@
-module Main where
+module Main (main) where
 
 main :: IO ()
-main = putStrLn "Hello, Haskell!"
+main = print foo
+
+foo = 5 :: Int
diff --git a/test/testdata/hieBiosMainIs/cabal.project b/test/testdata/hieBiosMainIs/cabal.project
new file mode 100644
--- /dev/null
+++ b/test/testdata/hieBiosMainIs/cabal.project
@@ -0,0 +1,1 @@
+packages: .
diff --git a/test/testdata/hieBiosMainIs/hieBiosMainIs.cabal b/test/testdata/hieBiosMainIs/hieBiosMainIs.cabal
--- a/test/testdata/hieBiosMainIs/hieBiosMainIs.cabal
+++ b/test/testdata/hieBiosMainIs/hieBiosMainIs.cabal
@@ -4,5 +4,6 @@
 build-type:          Simple
 executable hieBiosMainIs
   main-is:             Main.hs
-  build-depends:       base >=4.12 && <4.13
+  build-depends:       base
   default-language:    Haskell2010
+  ghc-options:         -Wall
diff --git a/test/testdata/missingModuleTest/missingModule/cabal.project b/test/testdata/missingModuleTest/missingModule/cabal.project
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/missingModule/cabal.project
@@ -0,0 +1,1 @@
+packages: ./
diff --git a/test/testdata/missingModuleTest/missingModule/hie.yaml b/test/testdata/missingModuleTest/missingModule/hie.yaml
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/missingModule/hie.yaml
@@ -0,0 +1,2 @@
+cradle:
+  cabal:
diff --git a/test/testdata/missingModuleTest/missingModule/missingModule.cabal b/test/testdata/missingModuleTest/missingModule/missingModule.cabal
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/missingModule/missingModule.cabal
@@ -0,0 +1,10 @@
+cabal-version: 3.4
+name:          missingModule
+version:       0.1.0.0
+build-type:    Simple
+
+library
+  hs-source-dirs:   ./src/
+  exposed-modules:
+  build-depends:    base
+  default-language: Haskell2010
diff --git a/test/testdata/missingModuleTest/missingModule/src/MyLib.hs b/test/testdata/missingModuleTest/missingModule/src/MyLib.hs
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/missingModule/src/MyLib.hs
@@ -0,0 +1,5 @@
+module MyLib where
+
+someFunc :: IO ()
+someFunc = do
+    putStrLn "someFunc"
diff --git a/test/testdata/missingModuleTest/noPrefixMatch/app/Main.hs b/test/testdata/missingModuleTest/noPrefixMatch/app/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/noPrefixMatch/app/Main.hs
@@ -0,0 +1,4 @@
+
+main :: IO ()
+main = do
+  putStrLn "someFunc"
diff --git a/test/testdata/missingModuleTest/noPrefixMatch/app/Other.hs b/test/testdata/missingModuleTest/noPrefixMatch/app/Other.hs
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/noPrefixMatch/app/Other.hs
@@ -0,0 +1,1 @@
+module Other where
diff --git a/test/testdata/missingModuleTest/noPrefixMatch/cabal.project b/test/testdata/missingModuleTest/noPrefixMatch/cabal.project
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/noPrefixMatch/cabal.project
@@ -0,0 +1,1 @@
+packages: ./
diff --git a/test/testdata/missingModuleTest/noPrefixMatch/hie.yaml b/test/testdata/missingModuleTest/noPrefixMatch/hie.yaml
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/noPrefixMatch/hie.yaml
@@ -0,0 +1,4 @@
+cradle:
+  cabal:
+    - path: ./app/Main.hs
+      component: exe:testExe
diff --git a/test/testdata/missingModuleTest/noPrefixMatch/noPrefixMatch.cabal b/test/testdata/missingModuleTest/noPrefixMatch/noPrefixMatch.cabal
new file mode 100644
--- /dev/null
+++ b/test/testdata/missingModuleTest/noPrefixMatch/noPrefixMatch.cabal
@@ -0,0 +1,9 @@
+cabal-version: 3.4
+name:          noPrefixMatch
+version:       0.1.0.0
+build-type:    Simple
+
+executable testExe
+  main-is:        Main.hs
+  hs-source-dirs: app
+  build-depends:  base
diff --git a/test/wrapper/Main.hs b/test/wrapper/Main.hs
--- a/test/wrapper/Main.hs
+++ b/test/wrapper/Main.hs
@@ -9,7 +9,7 @@
 
 projectGhcVersionTests :: TestTree
 projectGhcVersionTests = testGroup "--project-ghc-version"
-  [ stackTest "8.10.7"
+  [ stackTest "9.2.8"
   , testCase "cabal with global ghc" $ do
       ghcVer <- trimEnd <$> readProcess "ghc" ["--numeric-version"] ""
       testDir "test/wrapper/testdata/cabal-cur-ver" ghcVer
