diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.9.6.0
+version: 0.9.7.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -46,7 +46,7 @@
             ref-tf >=0.4.0.1 && <0.5,
             scientific >=0.3 && <0.4,
             stm >=2.4.4 && <2.6,
-            time >=1.5.0.1 && <1.9,
+            time >=1.5.0.1 && <1.10,
             unordered-containers >=0.2 && <0.3,
             vector >=0.10 && <0.13,
             unliftio-core >=0.1 && < 0.2
@@ -109,11 +109,12 @@
     build-depends:
         aeson >=0.8.0.2 && <1.5,
         base >=4.9 && <5,
+        base-compat >=0.9.0 && <0.12,
         base64-bytestring >=1.0.0.1 && <1.1,
         bytestring >=0.10.6.0 && <0.11,
         exceptions >=0.8 && <0.11,
-        lens >=3.8.5 && <4.18,
-        primitive >=0.6.1.0 && <0.7,
+        lens >=3.8.5 && <4.19,
+        primitive >=0.6.1.0 && <0.8,
         text >=1.2.1.3 && <1.3,
         transformers >=0.4.2.0 && <0.6
     default-language: Haskell2010
diff --git a/src-ghc/JavaScript/Array.hs b/src-ghc/JavaScript/Array.hs
--- a/src-ghc/JavaScript/Array.hs
+++ b/src-ghc/JavaScript/Array.hs
@@ -48,7 +48,7 @@
        (JSM, JSVal, SomeJSArray(..), JSArray,
         MutableJSArray, GHCJSPure(..))
 import Control.Lens.Operators ((^.))
-import Language.Javascript.JSaddle.Object (js2, js0, (##), js1, js)
+import Language.Javascript.JSaddle.Object (js2, js0, (<##), js1, js)
 import Language.Javascript.JSaddle.Value (valToNumber)
 import JavaScript.Array.Internal (create, fromList, fromListIO, toList, toListIO, index, read, push)
 
@@ -69,7 +69,7 @@
 {-# INLINE append #-}
 
 write :: Int -> JSVal -> MutableJSArray -> JSM ()
-write n e (SomeJSArray x) = void $ (x ## n) e
+write n e (SomeJSArray x) = void $ (x <## n) e
 {-# INLINE write #-}
 
 pop :: MutableJSArray -> JSM JSVal
diff --git a/src/Language/Javascript/JSaddle/Evaluate.hs b/src/Language/Javascript/JSaddle/Evaluate.hs
--- a/src/Language/Javascript/JSaddle/Evaluate.hs
+++ b/src/Language/Javascript/JSaddle/Evaluate.hs
@@ -50,7 +50,7 @@
      -> JSM JSVal
 #ifdef ghcjs_HOST_OS
 eval script = liftIO $ js_eval (toJSString script)
-foreign import javascript unsafe "$r = eval($1);"
+foreign import javascript safe "$r = eval($1);"
     js_eval :: JSString -> IO JSVal
 #else
 eval = evaluateScript . toJSString
diff --git a/src/Language/Javascript/JSaddle/Object.hs b/src/Language/Javascript/JSaddle/Object.hs
--- a/src/Language/Javascript/JSaddle/Object.hs
+++ b/src/Language/Javascript/JSaddle/Object.hs
@@ -557,7 +557,7 @@
 objCallAsFunction f this args = do
     rargs <- makeArgs args >>= liftIO . Array.fromListIO
     liftIO $ js_apply f this rargs
-foreign import javascript unsafe "$r = $1.apply($2, $3)"
+foreign import javascript safe "$r = $1.apply($2, $3)"
     js_apply :: Object -> Object -> MutableJSArray -> IO JSVal
 #else
 objCallAsFunction f this args = do
@@ -577,7 +577,7 @@
 objCallAsConstructor f args = do
     rargs <- makeArgs args >>= liftIO . Array.fromListIO
     liftIO $ js_new f rargs
-foreign import javascript unsafe "\
+foreign import javascript safe "\
         switch($2.length) {\
             case 0 : $r = new $1(); break;\
             case 1 : $r = new $1($2[0]); break;\
diff --git a/src/Language/Javascript/JSaddle/Run.hs b/src/Language/Javascript/JSaddle/Run.hs
--- a/src/Language/Javascript/JSaddle/Run.hs
+++ b/src/Language/Javascript/JSaddle/Run.hs
@@ -227,10 +227,11 @@
                         zipWithM_ putMVar resultMVars results
                         forM_ callbacksToFree $ \(JSValueReceived val) ->
                             atomically (modifyTVar' callbacks (M.delete val))
-                    (_, Failure callbacksToFree results exception) -> do
+                    (_, Failure callbacksToFree results exception err) -> do
                         -- The exception will only be rethrown in Haskell if/when one of the
                         -- missing results (if any) is evaluated.
                         putStrLn "A JavaScript exception was thrown! (may not reach Haskell code)"
+                        putStrLn err
                         zipWithM_ putMVar resultMVars $ results <> repeat (ThrowJSValue exception)
                         forM_ callbacksToFree $ \(JSValueReceived val) ->
                             atomically (modifyTVar' callbacks (M.delete val))
diff --git a/src/Language/Javascript/JSaddle/Run/Files.hs b/src/Language/Javascript/JSaddle/Run/Files.hs
--- a/src/Language/Javascript/JSaddle/Run/Files.hs
+++ b/src/Language/Javascript/JSaddle/Run/Files.hs
@@ -315,7 +315,8 @@
     \      catch (err) {\n\
     \        var n = ++jsaddle_index;\n\
     \        jsaddle_values.set(n, err);\n\
-    \        " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Failure\", \"contents\": [callbacksToFree, results, n]}]}" <> "\n\
+    \        console.log(err);\n\
+    \        " <> send "{\"tag\": \"BatchResults\", \"contents\": [batch[2], {\"tag\": \"Failure\", \"contents\": [callbacksToFree, results, n, String(err)]}]}" <> "\n\
     \      }\n\
     \      if(inCallback == 1) {\n\
     \          while(asyncBatch !== null) {\n\
diff --git a/src/Language/Javascript/JSaddle/Types.hs b/src/Language/Javascript/JSaddle/Types.hs
--- a/src/Language/Javascript/JSaddle/Types.hs
+++ b/src/Language/Javascript/JSaddle/Types.hs
@@ -504,7 +504,7 @@
 instance FromJSON Result
 
 data BatchResults = Success [JSValueReceived] [Result]
-                  | Failure [JSValueReceived] [Result] JSValueReceived
+                  | Failure [JSValueReceived] [Result] JSValueReceived String
              deriving (Show, Generic)
 
 instance ToJSON BatchResults where
