diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,3 +1,6 @@
+Changes in 0.19.0
+  - Better support for `cabal v2-*`
+
 Changes in 0.18.2
   - GHC 9.2 compatibility. (#305, thanks to Ryan Scott and Matthew Pickering)
 
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -352,6 +352,32 @@
 
 [language-pragma]: http://www.haskell.org/ghc/docs/latest/html/users_guide/pragmas.html#language-pragma
 
+### Limitations
+
+Due to [a GHC bug](https://gitlab.haskell.org/ghc/ghc/-/issues/20670), running
+`:set -XTemplateHaskell` within `ghci` may unload any modules that were
+specified on the command line.
+
+To address this `doctest >= 0.19.0` does two things:
+
+1. Doctest always enables `-XTemplateHaskell`.  So it is safe to use Template
+   Haskell in examples without enabling the extension explicitly.
+1. Doctest filters out `-XTemplateHaskell` from single-line `:set`-statements.
+   So it is still safe to include `:set -XTemplateHaskell` in examples for
+   documentation purposes.  It may just not work as intended in `ghci` due to
+   that GHC bug.
+
+Doctest does not filter out `-XTemplateHaskell` from multi-line
+`:set`-statements.  So if you e.g. use
+
+```
+>>> :{
+:set -XTemplateHaskell
+:}
+```
+then you are on your own.
+
+
 ### Cabal integration
 
 Doctest provides both, an executable and a library.  The library exposes a
diff --git a/doctest.cabal b/doctest.cabal
--- a/doctest.cabal
+++ b/doctest.cabal
@@ -1,13 +1,11 @@
-cabal-version: 1.12
+cabal-version: 2.0
 
 -- This file has been generated from package.yaml by hpack version 0.34.4.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: 3c86bef70634c1ec5f684a059a0805713b8f747ef2dcaecf351c5f773410e4d2
 
 name:           doctest
-version:        0.18.2
+version:        0.19.0
 synopsis:       Test interactive Haskell examples
 description:    The doctest program checks examples in source code comments.  It is modeled
                 after doctest for Python (<https://docs.python.org/3/library/doctest.html>).
@@ -140,7 +138,6 @@
       Runner.Example
       Util
       Language.Haskell.GhciWrapper
-      Paths_doctest
   build-depends:
       base >=4.5 && <5
     , base-compat >=0.7.0
@@ -158,8 +155,6 @@
 
 executable doctest
   main-is: Main.hs
-  other-modules:
-      Paths_doctest
   ghc-options: -Wall -threaded
   hs-source-dirs:
       driver
@@ -231,7 +226,6 @@
       Test.DocTest
       Util
       Language.Haskell.GhciWrapper
-      Paths_doctest
   type: exitcode-stdio-1.0
   ghc-options: -Wall -threaded
   cpp-options: -DTEST
@@ -241,6 +235,8 @@
       ghci-wrapper/src
   c-sources:
       test/integration/with-cbits/foo.c
+  build-tool-depends:
+      hspec-discover:hspec-discover
   build-depends:
       HUnit
     , QuickCheck >=2.13.1
diff --git a/src/Interpreter.hs b/src/Interpreter.hs
--- a/src/Interpreter.hs
+++ b/src/Interpreter.hs
@@ -11,6 +11,7 @@
 -- exported for testing
 , ghcInfo
 , haveInterpreterKey
+, filterExpression
 ) where
 
 import           System.Process
@@ -55,6 +56,7 @@
   let
     args = flags ++ [
         "--interactive"
+      , xTemplateHaskell
 #if __GLASGOW_HASKELL__ >= 802
       , "-fdiagnostics-color=never"
       , "-fno-diagnostics-show-caret"
@@ -62,6 +64,9 @@
       ]
   bracket (new defaultConfig{configGhci = ghc} args) close action
 
+xTemplateHaskell :: String
+xTemplateHaskell = "-XTemplateHaskell"
+
 -- | Evaluate an expression; return a Left value on exceptions.
 --
 -- An exception may e.g. be caused on unterminated multiline expressions.
@@ -75,11 +80,17 @@
 filterExpression e =
   case lines e of
     [] -> Right e
-    l  -> if firstLine == ":{" && lastLine /= ":}" then fail_ else Right e
+    l  -> if firstLine == ":{" && lastLine /= ":}" then err else Right (filterXTemplateHaskell e)
       where
         firstLine = strip $ head l
         lastLine  = strip $ last l
-        fail_ = Left "unterminated multiline command"
+        err = Left "unterminated multi-line command"
   where
     strip :: String -> String
     strip = dropWhile isSpace . reverse . dropWhile isSpace . reverse
+
+filterXTemplateHaskell :: String -> String
+filterXTemplateHaskell input = case words input of
+  [":set", setting] | setting == xTemplateHaskell -> ""
+  ":set" : xs | xTemplateHaskell `elem` xs -> unwords $ ":set" : filter (/= xTemplateHaskell) xs
+  _ -> input
diff --git a/src/Options.hs b/src/Options.hs
--- a/src/Options.hs
+++ b/src/Options.hs
@@ -25,9 +25,6 @@
 import           Data.List.Compat (intercalate, stripPrefix)
 import           Data.Monoid (Endo (Endo))
 
-import qualified Paths_doctest
-import           Data.Version (showVersion)
-
 #if __GLASGOW_HASKELL__ < 900
 import           Config as GHC
 #else
@@ -54,7 +51,11 @@
   ]
 
 version :: String
-version = showVersion Paths_doctest.version
+#ifdef CURRENT_PACKAGE_VERSION
+version = CURRENT_PACKAGE_VERSION
+#else
+version = "unknown"
+#endif
 
 ghcVersion :: String
 ghcVersion = GHC.cProjectVersion
diff --git a/src/Property.hs b/src/Property.hs
--- a/src/Property.hs
+++ b/src/Property.hs
@@ -30,7 +30,6 @@
   _ <- Interpreter.safeEval repl "import Test.QuickCheck ((==>))"
   _ <- Interpreter.safeEval repl "import Test.QuickCheck.All (polyQuickCheck)"
   _ <- Interpreter.safeEval repl "import Language.Haskell.TH (mkName)"
-  _ <- Interpreter.safeEval repl ":set -XTemplateHaskell"
   r <- freeVariables repl expression >>=
        (Interpreter.safeEval repl . quickCheck expression)
   case r of
diff --git a/test/InterpreterSpec.hs b/test/InterpreterSpec.hs
--- a/test/InterpreterSpec.hs
+++ b/test/InterpreterSpec.hs
@@ -5,7 +5,7 @@
 
 import           Test.Hspec
 
-import           Interpreter (interpreterSupported, haveInterpreterKey, ghcInfo, withInterpreter, safeEval)
+import           Interpreter (interpreterSupported, haveInterpreterKey, ghcInfo, withInterpreter, safeEval, filterExpression)
 
 main :: IO ()
 main = hspec spec
@@ -27,4 +27,14 @@
       Interpreter.safeEval ghci "23 + 42" `shouldReturn` Right "65\n"
 
     it "returns Left on unterminated multiline command" $ withInterpreter [] $ \ghci -> do
-      Interpreter.safeEval ghci ":{\n23 + 42" `shouldReturn` Left "unterminated multiline command"
+      Interpreter.safeEval ghci ":{\n23 + 42" `shouldReturn` Left "unterminated multi-line command"
+
+  describe "filterExpression" $ do
+    it "removes :set -XTemplateHaskell" $ do
+      filterExpression ":set -XTemplateHaskell" `shouldBe` Right ""
+
+    it "filters -XTemplateHaskell" $ do
+      filterExpression ":set -XTemplateHaskell -XCPP" `shouldBe` Right ":set -XCPP"
+
+    it "leaves :set-statement that do not set -XTemplateHaskell alone " $ do
+      filterExpression ":set -XFoo   -XBar" `shouldBe` Right ":set -XFoo   -XBar"
diff --git a/test/RunSpec.hs b/test/RunSpec.hs
--- a/test/RunSpec.hs
+++ b/test/RunSpec.hs
@@ -29,6 +29,14 @@
 main :: IO ()
 main = hspec spec
 
+
+removeLoadedPackageEnvironment :: String -> String
+#if __GLASGOW_HASKELL__ < 810
+removeLoadedPackageEnvironment = unlines . filter (not . isPrefixOf "Loaded package environment from ") . lines
+#else
+removeLoadedPackageEnvironment = id
+#endif
+
 spec :: Spec
 spec = do
   describe "doctest" $ do
@@ -59,14 +67,14 @@
     it "prints error message on invalid option" $ do
       (r, e) <- hCapture [stderr] . E.try $ doctest ["--foo", "test/integration/test-options/Foo.hs"]
       e `shouldBe` Left (ExitFailure 1)
-      r `shouldBe` unlines [
+      removeLoadedPackageEnvironment r `shouldBe` unlines [
           "doctest: unrecognized option `--foo'"
         , "Try `doctest --help' for more information."
         ]
 
     it "prints verbose description of a specification" $ do
       (r, ()) <- hCapture [stderr] $ doctest ["--verbose", "test/integration/testSimple/Fib.hs"]
-      r `shouldBe` unlines [
+      removeLoadedPackageEnvironment r `shouldBe` unlines [
           "### Started execution at test/integration/testSimple/Fib.hs:5."
         , "### example:"
         , "fib 10"
@@ -78,7 +86,7 @@
 
     it "prints verbose description of a property" $ do
       (r, ()) <- hCapture [stderr] $ doctest ["--verbose", "test/integration/property-bool/Foo.hs"]
-      r `shouldBe` unlines [
+      removeLoadedPackageEnvironment r `shouldBe` unlines [
           "### Started execution at test/integration/property-bool/Foo.hs:4."
         , "### property:"
         , "True"
@@ -91,7 +99,7 @@
     it "prints verbose error" $ do
       (r, e) <- hCapture [stderr] . E.try $ doctest ["--verbose", "test/integration/failing/Foo.hs"]
       e `shouldBe` Left (ExitFailure 1)
-      r `shouldBe` unlines [
+      removeLoadedPackageEnvironment r `shouldBe` unlines [
               "### Started execution at test/integration/failing/Foo.hs:5."
             , "### example:"
             , "23"
@@ -125,7 +133,7 @@
 #if __GLASGOW_HASKELL__ < 800
         r `shouldBe` "\nFoo.hs:6:1:\n    parse error (possibly incorrect indentation or mismatched brackets)\n"
 #else
-        r `shouldBe` "\nFoo.hs:6:1: error:\n    parse error (possibly incorrect indentation or mismatched brackets)\n"
+        removeLoadedPackageEnvironment r `shouldBe` "\nFoo.hs:6:1: error:\n    parse error (possibly incorrect indentation or mismatched brackets)\n"
 #endif
 
 #endif
diff --git a/test/doctests.hs b/test/doctests.hs
--- a/test/doctests.hs
+++ b/test/doctests.hs
@@ -7,9 +7,6 @@
     "-packageghc"
   , "-isrc"
   , "-ighci-wrapper/src"
-  , "-idist/build/autogen/"
-  , "-optP-include"
-  , "-optPdist/build/autogen/cabal_macros.h"
   , "src/Run.hs"
   , "src/PackageDBs.hs"
   ]
