diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,9 @@
+### 1.7.11.1
+
+- Replace *(return &dollar;!!)* with *forceValue = (&gt;&gt;= evaluate . force)*
+  which is more robust with imprecise exceptions.
+- Drop support for GHC versions older than *8.10*.
+
 ### 1.7.11
 
 - Use type synonym *LazyByteString* from *bytestring &ge; 0.11.2.0*.
@@ -20,7 +26,7 @@
 ### 1.7.9
 
 - Reify types of internal handlers from their signatures.
-- Dropped support for GHC versions older than *8.2*.
+- Drop support for GHC versions older than *8.2*.
 
 ### 1.7.8
 
diff --git a/NgxExport.hs b/NgxExport.hs
--- a/NgxExport.hs
+++ b/NgxExport.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, TemplateHaskell, ForeignFunctionInterface #-}
+{-# LANGUAGE TemplateHaskell, ForeignFunctionInterface #-}
 {-# LANGUAGE DerivingStrategies, GeneralizedNewtypeDeriving, DeriveAnyClass #-}
 {-# LANGUAGE ViewPatterns, PatternSynonyms, TupleSections #-}
 
@@ -92,6 +92,7 @@
 import           Control.Concurrent.Async
 import           GHC.IO.Exception (ioe_errno)
 import           Data.IORef
+import           Data.Bifunctor
 import qualified Data.ByteString as B
 import           Data.ByteString (ByteString)
 import qualified Data.ByteString.Unsafe as B
@@ -269,11 +270,7 @@
 
 ngxExport' :: (Name -> Q Exp) -> NgxExportDec
 ngxExport' mode e a h f = do
-#if MIN_VERSION_template_haskell(2,16,0)
     AppT (AppT ArrowT _) typeF@ConT {} <- reifyType h
-#else
-    VarI _ (AppT (AppT ArrowT _) typeF@ConT {}) _ <- reify h
-#endif
     sequence
         [sigD nameFt typeFt
         ,funD nameFt $ fBody [|exportType $(conE e `appE` modeF)|]
@@ -699,6 +696,17 @@
     show (FinalizeHTTPRequest _ (Just s)) = s
     show (FinalizeHTTPRequest _ Nothing) = ""
 
+forceValue :: NFData a => IO a -> IO a
+forceValue = (>>= evaluate . force)
+{-# SPECIALIZE INLINE forceValue ::
+    IO LazyByteString -> IO LazyByteString #-}
+{-# SPECIALIZE INLINE forceValue ::
+    IO (LazyByteString, Bool) -> IO (LazyByteString, Bool) #-}
+{-# SPECIALIZE INLINE forceValue ::
+    IO ContentHandlerResult -> IO ContentHandlerResult #-}
+{-# SPECIALIZE INLINE forceValue ::
+    IO UnsafeContentHandlerResult -> IO UnsafeContentHandlerResult #-}
+
 safeMallocBytes :: Int -> IO (Ptr a)
 safeMallocBytes =
     flip catchIOError (const $ return nullPtr) . mallocBytes
@@ -875,17 +883,15 @@
 
 yY :: YY -> YYImpl
 yY f x (I n) p pl spd = do
-    (s, r) <- safeYYHandler $ do
-        s <- f <$> B.unsafePackCStringLen (x, n)
-        fmap (, 0) $ return $!! s
+    (s, r) <- safeYYHandler $
+        fmap (, 0) $ forceValue $ f <$> B.unsafePackCStringLen (x, n)
     pokeLazyByteString s p pl spd
     return r
 
 ioyYCommon :: (CStringLen -> IO ByteString) -> IOYY -> YYImpl
 ioyYCommon pack f x (I n) p pl spd = do
-    (s, r) <- safeYYHandler $ do
-        s <- pack (x, n) >>= flip f False
-        fmap (, 0) $ return $!! s
+    (s, r) <- safeYYHandler $
+        fmap (, 0) $ forceValue $ pack (x, n) >>= flip f False
     pokeLazyByteString s p pl spd
     return r
 
@@ -905,9 +911,7 @@
 asyncIOCommon a (I fd) efd p pl pr spd = mask_ $
     async
     (do
-        (s, (r, exiting)) <- safeAsyncYYHandler $ do
-            (s, exiting) <- a
-            E.interruptible $ fmap (, (0, exiting)) $ return $!! s
+        (s, (r, exiting)) <- safeAsyncYYHandler $ second (0, ) <$> forceValue a
         pokeLazyByteString s p pl spd
         poke pr r
         if exiting
@@ -999,9 +1003,7 @@
     asyncIOCommon
     (do
         x' <- B.unsafePackCStringLen (x, n)
-        (s, ct, I st, rhs) <- E.interruptible $ do
-            v <- f x'
-            return $!! v
+        (s, ct, I st, rhs) <- E.interruptible $ forceValue $ f x'
         pokeAsyncHandlerData ct pct plct spct pst st rhs prhs plrhs sprhs
         return (s, False)
     ) fd efd
@@ -1013,9 +1015,7 @@
     (do
         b' <- peekRequestBodyChunks tmpf b m
         x' <- B.unsafePackCStringLen (x, n)
-        (s, ct, I st, rhs) <- E.interruptible $ do
-            v <- f b' x'
-            return $!! v
+        (s, ct, I st, rhs) <- E.interruptible $ forceValue $ f b' x'
         pokeAsyncHandlerData ct pct plct spct pst st rhs prhs plrhs sprhs
         return (s, False)
     ) fd efd
@@ -1052,10 +1052,9 @@
 handler :: Handler -> HandlerImpl
 handler f x (I n) p pl pct plct spct pst prhs plrhs sprhs spd =
     safeHandler pct pst $ do
-        v@(s, ct, I st, rhs) <- f <$> B.unsafePackCStringLen (x, n)
-        lct <- (return $!! v) >> pokeContentTypeAndStatus ct pct plct pst st
-        (return $!! lct) >>
-            pokeLazyByteString (fromHTTPHeaders rhs) prhs plrhs sprhs
+        (s, ct, I st, rhs) <- forceValue $ f <$> B.unsafePackCStringLen (x, n)
+        lct <- pokeContentTypeAndStatus ct pct plct pst st
+        pokeLazyByteString (fromHTTPHeaders rhs) prhs plrhs sprhs
         pokeLazyByteString s p pl spd
         when (lct > 0) $ newStablePtr ct >>= poke spct
         return 0
@@ -1070,8 +1069,8 @@
 unsafeHandler :: UnsafeHandler -> UnsafeHandlerImpl
 unsafeHandler f x (I n) p pl pct plct pst =
     safeHandler pct pst $ do
-        v@(s, ct, I st) <- f <$> B.unsafePackCStringLen (x, n)
-        (return $!! v) >> void (pokeContentTypeAndStatus ct pct plct pst st)
+        (s, ct, I st) <- forceValue $ f <$> B.unsafePackCStringLen (x, n)
+        void $ pokeContentTypeAndStatus ct pct plct pst st
         PtrLen t l <- B.unsafeUseAsCStringLen s return
         pokeCStringLen t l p pl
         return 0
diff --git a/ngx-export.cabal b/ngx-export.cabal
--- a/ngx-export.cabal
+++ b/ngx-export.cabal
@@ -1,5 +1,5 @@
 name:                       ngx-export
-version:                    1.7.11
+version:                    1.7.11.1
 synopsis:                   Helper module for Nginx Haskell module
 description:                Helper module for
         <https://github.com/lyokha/nginx-haskell-module Nginx Haskell module>.
@@ -17,8 +17,8 @@
 
 library
   default-language:         Haskell2010
-  build-depends:            base >= 4.10 && < 5
-                          , template-haskell >= 2.11.0.0
+  build-depends:            base >= 4.14 && < 5
+                          , template-haskell >= 2.16.0.0
                           , bytestring >= 0.11.2.0
                           , monad-loops >= 0.4.2
                           , deepseq >= 1.2.0.0
