diff --git a/hls-test-utils.cabal b/hls-test-utils.cabal
--- a/hls-test-utils.cabal
+++ b/hls-test-utils.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name:          hls-test-utils
-version:       2.6.0.0
+version:       2.7.0.0
 synopsis:      Utilities used in the tests of Haskell Language Server
 description:
   Please see the README on GitHub at <https://github.com/haskell/haskell-language-server#readme>
@@ -35,19 +35,16 @@
     , aeson
     , async
     , base                    >=4.12 && <5
-    , blaze-markup
     , bytestring
     , containers
     , data-default
     , directory
     , extra
     , filepath
-    , ghcide                  == 2.6.0.0
-    , hls-graph
-    , hls-plugin-api          == 2.6.0.0
+    , ghcide                  == 2.7.0.0
+    , hls-plugin-api          == 2.7.0.0
     , lens
-    , lsp                     ^>=2.3
-    , lsp-test                ^>=0.16
+    , lsp-test                ^>=0.17
     , lsp-types               ^>=2.1
     , tasty
     , tasty-expected-failure
@@ -56,11 +53,10 @@
     , tasty-rerun
     , temporary
     , text
-    , unordered-containers
     , row-types
-  ghc-options:      -Wall
+  ghc-options:      -Wall -Wunused-packages
 
   if flag(pedantic)
     ghc-options: -Werror
 
-  default-language: Haskell2010
+  default-language: GHC2021
diff --git a/src/Test/Hls.hs b/src/Test/Hls.hs
--- a/src/Test/Hls.hs
+++ b/src/Test/Hls.hs
@@ -1,14 +1,9 @@
-{-# LANGUAGE DataKinds                #-}
-{-# LANGUAGE DisambiguateRecordFields #-}
-{-# LANGUAGE DuplicateRecordFields    #-}
-{-# LANGUAGE GADTs                    #-}
-{-# LANGUAGE LambdaCase               #-}
-{-# LANGUAGE NamedFieldPuns           #-}
-{-# LANGUAGE OverloadedLists          #-}
-{-# LANGUAGE OverloadedStrings        #-}
-{-# LANGUAGE PolyKinds                #-}
-{-# LANGUAGE RankNTypes               #-}
-{-# LANGUAGE TypeApplications         #-}
+{-# LANGUAGE DataKinds             #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE GADTs                 #-}
+{-# LANGUAGE LambdaCase            #-}
+{-# LANGUAGE OverloadedLists       #-}
+{-# LANGUAGE OverloadedStrings     #-}
 module Test.Hls
   ( module Test.Tasty.HUnit,
     module Test.Tasty,
@@ -127,7 +122,6 @@
 import           Test.Tasty.Golden
 import           Test.Tasty.HUnit
 import           Test.Tasty.Ingredients.Rerun
-import           Test.Tasty.Runners                 (NumThreads (..))
 
 data Log
   = LogIDEMain IDEMain.Log
@@ -152,7 +146,7 @@
 
 -- | Run 'defaultMainWithRerun', limiting each single test case running at most 10 minutes
 defaultTestRunner :: TestTree -> IO ()
-defaultTestRunner = defaultMainWithRerun . adjustOption (const $ NumThreads 1) . adjustOption (const $ mkTimeout 600000000)
+defaultTestRunner = defaultMainWithRerun . adjustOption (const $ mkTimeout 600000000)
 
 gitDiff :: FilePath -> FilePath -> [String]
 gitDiff fRef fNew = ["git", "-c", "core.fileMode=false", "diff", "--no-index", "--text", "--exit-code", fRef, fNew]
@@ -440,12 +434,12 @@
           | val /= "0" -> \action -> do
             (tempDir, _) <- newTempDir
             a <- action tempDir
-            logWith recorder Debug $ LogNoCleanup
+            logWith recorder Debug LogNoCleanup
             pure a
 
         _ -> \action -> do
           a <- withTempDir action
-          logWith recorder Debug $ LogCleanup
+          logWith recorder Debug LogCleanup
           pure a
 
   runTestInDir $ \tmpDir -> do
diff --git a/src/Test/Hls/Util.hs b/src/Test/Hls/Util.hs
--- a/src/Test/Hls/Util.hs
+++ b/src/Test/Hls/Util.hs
@@ -1,13 +1,9 @@
 {-# LANGUAGE CPP                   #-}
+{-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE GADTs                 #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedLabels      #-}
 {-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE TypeOperators         #-}
-{-# LANGUAGE OverloadedLabels #-}
-{-# LANGUAGE TypeApplications #-}
-{-# LANGUAGE DataKinds #-}
 module Test.Hls.Util
   (  -- * Test Capabilities
       codeActionResolveCaps
@@ -54,22 +50,22 @@
 
 import           Control.Applicative.Combinators (skipManyTill, (<|>))
 import           Control.Exception               (catch, throwIO)
-import           Control.Lens                    ((&), (?~), (^.), _Just, (.~))
+import           Control.Lens                    (_Just, (&), (.~), (?~), (^.))
 import           Control.Monad
 import           Control.Monad.IO.Class
 import qualified Data.Aeson                      as A
 import           Data.Bool                       (bool)
 import           Data.Default
-import           Data.Row
-import           Data.Proxy
 import           Data.List.Extra                 (find)
+import           Data.Proxy
+import           Data.Row
 import qualified Data.Set                        as Set
 import qualified Data.Text                       as T
 import           Development.IDE                 (GhcVersion (..), ghcVersion)
-import qualified Language.LSP.Test               as Test
-import           Language.LSP.Protocol.Types
+import qualified Language.LSP.Protocol.Lens      as L
 import           Language.LSP.Protocol.Message
-import qualified Language.LSP.Protocol.Lens         as L
+import           Language.LSP.Protocol.Types
+import qualified Language.LSP.Test               as Test
 import           System.Directory
 import           System.FilePath
 import           System.Info.Extra               (isMac, isWindows)
@@ -304,7 +300,7 @@
     handleDiagnostic testId = do
         diagsNot <- Test.message SMethod_TextDocumentPublishDiagnostics
         let fileUri = diagsNot ^. L.params . L.uri
-            ( diags) = diagsNot ^. L.params . L.diagnostics
+            diags = diagsNot ^. L.params . L.diagnostics
             res = filter matches diags
         if fileUri == document ^. L.uri && not (null res)
             then return res else handleMessages testId
