diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,8 @@
 # Changelog for ghc-lib-parser-ex
 
+## 9.8.0.1 released
+- New functions `isWildPat`
+
 ## 9.8.0.0 released
 - Companion to `ghc-lib-parser-9.8.1.20231009`
 
diff --git a/ghc-lib-parser-ex.cabal b/ghc-lib-parser-ex.cabal
--- a/ghc-lib-parser-ex.cabal
+++ b/ghc-lib-parser-ex.cabal
@@ -1,6 +1,6 @@
 cabal-version:  1.18
 name:           ghc-lib-parser-ex
-version:        9.8.0.0
+version:        9.8.0.1
 description:    Please see the README on GitHub at <https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme>
 homepage:       https://github.com/shayne-fletcher/ghc-lib-parser-ex#readme
 bug-reports:    https://github.com/shayne-fletcher/ghc-lib-parser-ex/issues
diff --git a/src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs b/src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs
--- a/src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs
+++ b/src/Language/Haskell/GhclibParserEx/GHC/Hs/Expr.hs
@@ -83,7 +83,13 @@
 isAnyApp x = isApp x || isOpApp x
 isDo = \case (L _ HsDo{}) -> True; _ -> False
 isLexeme = \case (L _ HsVar{}) -> True; (L _ HsOverLit{}) -> True; (L _ HsLit{}) -> True; _ -> False
+-- 'isLambda' semantics are match form `\p -> e` exclusively
+#if ! ( defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
+--ghc api >= 9.8.1
+isLambda = \case (L _ (HsLam _ LamSingle _)) -> True; _ -> False
+#else
 isLambda = \case (L _ HsLam{}) -> True; _ -> False
+#endif
 #if ! ( defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
 -- ghc api >= 9.6.1
 isQuasiQuoteExpr = \case (L _ (HsUntypedSplice _ HsQuasiQuote{})) -> True; _ -> False
@@ -100,8 +106,12 @@
   (L _ HsLam{}) -> True
   (L _ ExplicitTuple{}) -> True
   (L _ ExplicitList{}) -> True
-#if ! ( defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
--- ghc api >= 9.4.1
+
+#if ! ( defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
+-- ghc api >= 9.8
+  (L _ (HsPar _  x )) -> isWHNF x
+#elif ! ( defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
+-- ghc api >= 9.4
   (L _ (HsPar _ _ x _)) -> isWHNF x
 #else
   (L _ (HsPar _ x)) -> isWHNF x
@@ -127,11 +137,13 @@
 #endif
 isQuasiQuoteSplice = \case HsQuasiQuote{} -> True; _ -> False
 
-
-#if ! ( defined (GHC_8_10) || defined (GHC_8_8) )
+#if ( defined (GHC_8_10) || defined (GHC_8_8) )
 isStrictMatch :: HsMatchContext GhcPs -> Bool
-#else
+#elif ( defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) )
 isStrictMatch :: HsMatchContext RdrName -> Bool
+#else
+-- ghc > 9.8.1
+isStrictMatch :: HsMatchContext (GenLocated SrcSpanAnnN RdrName) -> Bool
 #endif
 isStrictMatch = \case FunRhs{mc_strictness=SrcStrict} -> True; _ -> False
 
diff --git a/src/Language/Haskell/GhclibParserEx/GHC/Hs/Pat.hs b/src/Language/Haskell/GhclibParserEx/GHC/Hs/Pat.hs
--- a/src/Language/Haskell/GhclibParserEx/GHC/Hs/Pat.hs
+++ b/src/Language/Haskell/GhclibParserEx/GHC/Hs/Pat.hs
@@ -8,6 +8,7 @@
   , fromPChar
   , hasPFieldsDotDot
   , isPFieldWildcard, isPWildcard, isPFieldPun, isPatTypeSig, isPBangPat, isPViewPat
+  , isWildPat {- alias for 'isPWildcard' -}
   , isSplicePat
  ) where
 
@@ -126,6 +127,9 @@
 isPWildcard (L _ (WildPat _)) = True
 #endif
 isPWildcard _ = False
+
+isWildPat :: LPat GhcPs -> Bool
+isWildPat = isPWildcard
 
 #if !( defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8) )
 isPFieldPun :: LHsFieldBind GhcPs (LFieldOcc GhcPs) (LPat GhcPs) -> Bool
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -17,11 +17,11 @@
 import Data.List.Extra
 import Data.Maybe
 import Data.Generics.Uniplate.Data
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2)
+#if !(defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
 import GHC.Data.Bag
-#if !defined (GHC_9_2)
+#  if !defined (GHC_9_2)
 import GHC.Driver.Errors.Types
-#endif
+#  endif
 import GHC.Types.Error
 #endif
 
@@ -47,21 +47,26 @@
 import Language.Haskell.GhclibParserEx.GHC.Driver.Session
 import Language.Haskell.GhclibParserEx.GHC.Types.Name.Reader
 
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10)
+#if !defined (GHC_8_8)
+-- ghc >= 8.10
 import GHC.Hs
 #else
 import HsSyn
 #endif
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0)
+#if !( defined (GHC_8_10) || defined (GHC_8_8) )
+-- ghc >= 9.0
 import GHC.Types.SrcLoc
 import GHC.Driver.Session
 import GHC.Parser.Lexer
-#  if !defined (GHC_9_10) && !defined (GHC_9_8) && !defined (GHC_9_6)
+#  if defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0)
+--   9.0 <= ghc <= 9.4
 import GHC.Utils.Outputable
 #  endif
 #  if !defined (GHC_9_0)
+--   ghc >= 9.2
 import GHC.Driver.Ppr
-#    if !defined (GHC_9_10) && !defined (GHC_9_8) && !defined (GHC_9_6) && !defined (GHC_9_4)
+#    if defined (GHC_9_2)
+--     ghc = 9.2
 import GHC.Parser.Errors.Ppr
 #    endif
 #  endif
@@ -69,6 +74,7 @@
 import GHC.Types.Name.Reader
 import GHC.Types.Name.Occurrence
 #else
+-- ghc < 9.0
 import SrcLoc
 import DynFlags
 import Lexer
@@ -77,15 +83,17 @@
 import RdrName
 import OccName
 #endif
-import GHC.LanguageExtensions.Type
 #if defined (GHC_8_8)
+-- ghc = 8.8
 import Bag
 #endif
+import GHC.LanguageExtensions.Type
 
 basicDynFlags :: DynFlags
 basicDynFlags =
   defaultDynFlags fakeSettings
-#if !defined (GHC_9_10) && !defined (GHC_9_8) && !defined (GHC_9_6)
+#if defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8)
+-- ghc <= 9.4
                                 fakeLlvmConfig
 #endif
 
@@ -113,7 +121,8 @@
     writeFile relPath contents
     return relPath
 
-#if defined(GHC_9_10) || defined (GHC_9_8) || defined(GHC_9_6)
+#if !(defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.6
 report :: DynFlags -> Bag (MsgEnvelope GhcMessage) -> String
 report flags msgs = concat [ showSDoc flags msg | msg <- pprMsgEnvelopeBagWithLocDefault msgs ]
 #elif defined (GHC_9_4)
@@ -130,7 +139,8 @@
 chkParseResult :: DynFlags -> ParseResult a -> IO ()
 chkParseResult flags = \case
     POk s _ -> do
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4)
+#if !(defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.4
       let (wrns, errs) = getPsMessages s
 #elif defined (GHC_9_2)
       let (wrns, errs) = getMessages s
@@ -138,7 +148,8 @@
       let (wrns, errs) = getMessages s flags
 #endif
       when (not (null errs) || not (null wrns)) $
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4)
+#if !(defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.4
         assertFailure (
           report flags (getMessages (GhcPsMessage <$> wrns)) ++
           report flags (getMessages (GhcPsMessage <$> errs))
@@ -148,7 +159,8 @@
 #else
         assertFailure (report flags wrns ++ report flags errs)
 #endif
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4)
+#if !(defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.4
     PFailed s -> assertFailure (report flags $ getMessages (GhcPsMessage <$> snd (getPsMessages s)))
 #elif defined (GHC_9_2)
     PFailed s -> assertFailure (report flags $ fmap pprError (snd (getMessages s)))
@@ -263,7 +275,8 @@
       exprTest "1 + 2 * 3" flags
         (\e ->
             assertBool "parse tree not affected" $
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2)
+#if !(defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.2
               showSDocUnsafe (showAstData BlankSrcSpan BlankEpAnnotations e) /=
               showSDocUnsafe (showAstData BlankSrcSpan BlankEpAnnotations (applyFixities [] e))
 #else
@@ -275,7 +288,8 @@
       case parseDeclaration "f (1 : 2 :[]) = 1" flags of
         POk _ d ->
           assertBool "parse tree not affected" $
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2)
+#if !(defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.2
           showSDocUnsafe (showAstData BlankSrcSpan BlankEpAnnotations d) /=
           showSDocUnsafe (showAstData BlankSrcSpan BlankEpAnnotations (applyFixities [] d))
 #else
@@ -329,12 +343,20 @@
   , testCase "isDot" $ test "f . g" $ \case L _ (OpApp _ _ op _) -> assert' $ isDot op; _ -> assertFailure "unexpected"
   , testCase "isReturn" $ test "return x" $ \case L _ (HsApp _ f _) -> assert' $ isReturn f; _ -> assertFailure "unexpected"
   , testCase "isReturn" $ test "pure x" $ \case L _ (HsApp _ f _) -> assert' $ isReturn f; _ -> assertFailure "unexpected"
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4)
+#if !(defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.8
+  , testCase "isSection" $ test "(1 +)" $ \case L _ (HsPar _ x) -> assert' $ isSection x; _ -> assertFailure "unexpected"
+#elif !(defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.4
   , testCase "isSection" $ test "(1 +)" $ \case L _ (HsPar _ _ x _) -> assert' $ isSection x; _ -> assertFailure "unexpected"
 #else
   , testCase "isSection" $ test "(1 +)" $ \case L _ (HsPar _ x) -> assert' $ isSection x; _ -> assertFailure "unexpected"
 #endif
-#if defined (GHC_9_10) || defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4)
+#if !(defined (GHC_9_8) || defined (GHC_9_6) || defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.8
+  , testCase "isSection" $ test "(+ 1)" $ \case L _ (HsPar _ x) -> assert' $ isSection x; _ -> assertFailure "unexpected"
+#elif !(defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
+-- ghc >= 9.4
   , testCase "isSection" $ test "(+ 1)" $ \case L _ (HsPar _ _ x _) -> assert' $ isSection x; _ -> assertFailure "unexpected"
 #else
   , testCase "isSection" $ test "(+ 1)" $ \case L _ (HsPar _ x) -> assert' $ isSection x; _ -> assertFailure "unexpected"
@@ -359,6 +381,7 @@
   , testCase "isLexeme" $ test "3" $ assert' . isLexeme
   , testCase "isLexeme" $ test "f x" $ assert' . not . isLexeme
   , testCase "isLambda" $ test "\\x -> 12" $ assert' . isLambda
+  , testCase "isLambda" $ test_with_exts [ LambdaCase ]  "\\case _ -> 12" $ assert' . not . isLambda
   , testCase "isLambda" $ test "foo" $ assert' . not . isLambda
   , testCase "isDotApp" $ test "f . g" $ assert' . isDotApp
   , testCase "isDotApp" $ test "f $ g" $ assert' . not . isDotApp
@@ -389,7 +412,7 @@
   , testCase "isSpliceDecl" $ test "$x" $ assert' . isSpliceDecl . unLoc
   , testCase "isSpliceDecl" $ test "f$x" $ assert' . not . isSpliceDecl . unLoc
   , testCase "isSpliceDecl" $ test "$(a + b)" $ assert' . isSpliceDecl . unLoc
-#if !( defined(GHC_8_8) || defined(GHC_8_10) || defined (GHC_9_0) || defined (GHC_9_2) || defined(GHC_9_4) )
+#if !(defined (GHC_9_4) || defined (GHC_9_2) || defined (GHC_9_0) || defined (GHC_8_10) || defined (GHC_8_8))
   -- ghc api >= 9.6.1
   , testCase "isTypedSplice" $ test "$$foo" $ assert' . isTypedSplice . unLoc
   , testCase "isTypedSplice" $ test "$foo" $ assert' . not . isTypedSplice . unLoc
@@ -443,6 +466,8 @@
   , testCase "fromPChar" $ test "'a'" $ assert' . (== Just 'a') . fromPChar
   , testCase "fromPChar" $ test "\"a\"" $ assert' . isNothing . fromPChar
   , testCase "isSplicePat" $ test "$(varP pylonExPtrVarName)" $ assert' . isSplicePat
+  , testCase "isWildPat" $ test "_" $ assert' . isWildPat
+  , testCase "isWildPat" $ test "p@(L _ (VisPat _ pat))" $ assert' . not . isWildPat
   ]
   where
     assert' = assertBool ""
