diff --git a/GHCi/Message.hs b/GHCi/Message.hs
--- a/GHCi/Message.hs
+++ b/GHCi/Message.hs
@@ -245,6 +245,7 @@
 
   StartRecover :: THMessage ()
   EndRecover :: Bool -> THMessage ()
+  FailIfErrs :: THMessage (THResult ())
 
   -- | Indicates that this RunTH is finished, and the next message
   -- will be the result of RunTH (a QResult).
@@ -275,9 +276,10 @@
     14 -> THMsg <$> return ExtsEnabled
     15 -> THMsg <$> return StartRecover
     16 -> THMsg <$> EndRecover <$> get
-    17 -> return (THMsg RunTHDone)
-    18 -> THMsg <$> AddModFinalizer <$> get
-    19 -> THMsg <$> (AddForeignFilePath <$> get <*> get)
+    17 -> THMsg <$> return FailIfErrs
+    18 -> return (THMsg RunTHDone)
+    19 -> THMsg <$> AddModFinalizer <$> get
+    20 -> THMsg <$> (AddForeignFilePath <$> get <*> get)
     _  -> THMsg <$> AddCorePlugin <$> get
 
 putTHMessage :: THMessage a -> Put
@@ -299,10 +301,11 @@
   ExtsEnabled                 -> putWord8 14
   StartRecover                -> putWord8 15
   EndRecover a                -> putWord8 16 >> put a
-  RunTHDone                   -> putWord8 17
-  AddModFinalizer a           -> putWord8 18 >> put a
-  AddForeignFilePath lang a   -> putWord8 19 >> put lang >> put a
-  AddCorePlugin a             -> putWord8 20 >> put a
+  FailIfErrs                  -> putWord8 17
+  RunTHDone                   -> putWord8 18
+  AddModFinalizer a           -> putWord8 19 >> put a
+  AddForeignFilePath lang a   -> putWord8 20 >> put lang >> put a
+  AddCorePlugin a             -> putWord8 21 >> put a
 
 
 data EvalOpts = EvalOpts
diff --git a/GHCi/TH.hs b/GHCi/TH.hs
--- a/GHCi/TH.hs
+++ b/GHCi/TH.hs
@@ -105,6 +105,7 @@
 import qualified Data.ByteString.Lazy as LB
 import Data.Data
 import Data.Dynamic
+import Data.Either
 import Data.IORef
 import Data.Map (Map)
 import qualified Data.Map as M
@@ -169,13 +170,13 @@
   qReport isError msg = ghcCmd (Report isError msg)
 
   -- See Note [TH recover with -fexternal-interpreter] in TcSplice
-  qRecover (GHCiQ h) (GHCiQ a) = GHCiQ $ \s -> (do
+  qRecover (GHCiQ h) a = GHCiQ $ \s -> mask $ \unmask -> do
     remoteTHCall (qsPipe s) StartRecover
-    (r, s') <- a s
-    remoteTHCall (qsPipe s) (EndRecover False)
-    return (r,s'))
-      `catch`
-       \GHCiQException{} -> remoteTHCall (qsPipe s) (EndRecover True) >> h s
+    e <- try $ unmask $ runGHCiQ (a <* ghcCmd FailIfErrs) s
+    remoteTHCall (qsPipe s) (EndRecover (isLeft e))
+    case e of
+      Left GHCiQException{} -> h s
+      Right r -> return r
   qLookupName isType occ = ghcCmd (LookupName isType occ)
   qReify name = ghcCmd (Reify name)
   qReifyFixity name = ghcCmd (ReifyFixity name)
diff --git a/ghci.cabal b/ghci.cabal
--- a/ghci.cabal
+++ b/ghci.cabal
@@ -1,5 +1,5 @@
 name:           ghci
-version:        8.6.1
+version:        8.6.4
 license:        BSD3
 license-file:   LICENSE
 category:       GHC
@@ -72,9 +72,9 @@
         containers       >= 0.5 && < 0.7,
         deepseq          == 1.4.*,
         filepath         == 1.4.*,
-        ghc-boot         == 8.6.1,
-        ghc-boot-th      == 8.6.1,
-        ghc-heap         == 8.6.1,
+        ghc-boot         == 8.6.4,
+        ghc-boot-th      == 8.6.4,
+        ghc-heap         == 8.6.4,
         template-haskell == 2.14.*,
         transformers     == 0.5.*
 
