diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.9.8.3
+version: 0.9.9.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -29,14 +29,17 @@
 
 library
 
-    if impl(ghcjs -any)
+    if impl(ghcjs -any) || arch(javascript)
         build-depends:
-            ghcjs-base -any,
-            ghcjs-prim -any
+            ghcjs-base -any
+        -- GHC includes GHC.JS.Prim in base
+        if impl(ghcjs -any)
+            build-depends:
+                ghcjs-prim -any
     else
         build-depends:
             attoparsec >=0.11 && <0.15,
-            containers >=0.5.6.2 && <0.7,
+            containers >=0.5.6.2 && <0.8,
             deepseq >=1.3 && < 1.6,
             filepath >=1.4.0.0 && <1.5,
             ghc-prim,
@@ -114,7 +117,7 @@
         bytestring >=0.10.6.0 && <0.13,
         exceptions >=0.8 && <0.11,
         lens >=3.8.5 && <5.3,
-        primitive >=0.6.1.0 && <0.9,
+        primitive >=0.6.1.0 && <0.10,
         text >=1.2.1.3 && <1.3 || >= 2.0 && < 2.2,
         transformers >=0.4.2.0 && <0.7
     default-language: Haskell2010
diff --git a/src-ghc/JavaScript/TypedArray/DataView/Internal.hs b/src-ghc/JavaScript/TypedArray/DataView/Internal.hs
--- a/src-ghc/JavaScript/TypedArray/DataView/Internal.hs
+++ b/src-ghc/JavaScript/TypedArray/DataView/Internal.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE CPP #-}
-{-# LANGUAGE JavaScriptFFI #-}
 {-# LANGUAGE ForeignFunctionInterface #-}
 {-# LANGUAGE UnliftedFFITypes #-}
 {-# LANGUAGE GHCForeignImportPrim #-}
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,12 @@
      -> JSM JSVal
 #ifdef ghcjs_HOST_OS
 eval script = liftIO $ js_eval (toJSString script)
-foreign import javascript safe "$r = eval($1);"
+foreign import javascript safe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return eval($1); })"
+#else
+  "$r = eval($1);"
+#endif
     js_eval :: JSString -> IO JSVal
 #else
 eval = evaluateScript . toJSString
diff --git a/src/Language/Javascript/JSaddle/Exception.hs b/src/Language/Javascript/JSaddle/Exception.hs
--- a/src/Language/Javascript/JSaddle/Exception.hs
+++ b/src/Language/Javascript/JSaddle/Exception.hs
@@ -19,7 +19,11 @@
 
 import qualified Control.Exception as E (Exception)
 #ifdef ghcjs_HOST_OS
+#if __GLASGOW_HASKELL__ >= 900
+import GHC.JS.Prim (JSVal)
+#else
 import GHCJS.Prim (JSVal)
+#endif
 #else
 import GHCJS.Prim.Internal (JSVal)
 #endif
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
@@ -102,7 +102,11 @@
 import Data.Coerce (coerce)
 #ifdef ghcjs_HOST_OS
 import GHCJS.Types (nullRef)
+#if __GLASGOW_HASKELL__ >= 900
+import GHC.JS.Foreign.Callback
+#else
 import GHCJS.Foreign.Callback
+#endif
        (releaseCallback, syncCallback2, asyncCallback2, OnBlocked(..), Callback)
 import GHCJS.Marshal (ToJSVal(..))
 import JavaScript.Array (MutableJSArray)
@@ -440,7 +444,13 @@
 
 
 #ifdef ghcjs_HOST_OS
-foreign import javascript unsafe "$r = function () { $1(this, arguments); }"
+-- Do not replace `function ()` with `=>` as `arguments` will not work
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return function () { $1(this, arguments); }; })"
+#else
+  "$r = function () { $1(this, arguments); }"
+#endif
     makeFunctionWithCallback :: Callback (JSVal -> JSVal -> IO ()) -> IO Object
 #endif
 
@@ -527,7 +537,12 @@
 
 -- | JavaScript's global object
 #ifdef ghcjs_HOST_OS
-foreign import javascript unsafe "$r = globalThis"
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(() => { return globalThis; })"
+#else
+  "$r = globalThis"
+#endif
     global :: Object
 #else
 global :: Object
@@ -556,7 +571,12 @@
 objCallAsFunction f this args = do
     rargs <- makeArgs args >>= liftIO . Array.fromListIO
     liftIO $ js_apply f this rargs
-foreign import javascript safe "$r = $1.apply($2, $3)"
+foreign import javascript safe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2,$3) => { return $1.apply($2, $3); })"
+#else
+  "$r = $1.apply($2, $3)"
+#endif
     js_apply :: Object -> Object -> MutableJSArray -> IO JSVal
 #else
 objCallAsFunction f this args = do
@@ -576,7 +596,9 @@
 objCallAsConstructor f args = do
     rargs <- makeArgs args >>= liftIO . Array.fromListIO
     liftIO $ js_new f rargs
-foreign import javascript safe "\
+foreign import javascript safe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2) => {\
         switch($2.length) {\
             case 0 : $r = new $1(); break;\
             case 1 : $r = new $1($2[0]); break;\
@@ -598,7 +620,33 @@
                     i.constructor = $1;\
                     $r = i;\
                 }\
+        }\
+        return $r;\
+  })"
+#else
+       "switch($2.length) {\
+            case 0 : $r = new $1(); break;\
+            case 1 : $r = new $1($2[0]); break;\
+            case 2 : $r = new $1($2[0],$2[1]); break;\
+            case 3 : $r = new $1($2[0],$2[1],$2[2]); break;\
+            case 4 : $r = new $1($2[0],$2[1],$2[2],$2[3]); break;\
+            case 5 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4]); break;\
+            case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]); break;\
+            case 7 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]); break;\
+            default:\
+                var temp = function() {\
+                    ret = $1.apply(this, $2);\
+                };\
+                temp.prototype = $1.prototype;\
+                var i = new temp();\
+                if(ret instanceof Object) {\
+                    $r = ret;\
+                } else {\
+                    i.constructor = $1;\
+                    $r = i;\
+                }\
         }"
+#endif
     js_new :: Object -> MutableJSArray -> IO JSVal
 #else
 objCallAsConstructor f args = do
diff --git a/src/Language/Javascript/JSaddle/Properties.hs b/src/Language/Javascript/JSaddle/Properties.hs
--- a/src/Language/Javascript/JSaddle/Properties.hs
+++ b/src/Language/Javascript/JSaddle/Properties.hs
@@ -60,7 +60,12 @@
                       -> JSM JSVal -- ^ returns the property value.
 #ifdef ghcjs_HOST_OS
 objGetPropertyAtIndex this index = js_tryIndex index this
-foreign import javascript unsafe "$r=$2[$1]"
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2) => { return $2[$1]; })"
+#else
+  "$r=$2[$1]"
+#endif
     js_tryIndex :: Int -> Object -> IO JSVal
 #else
 objGetPropertyAtIndex this index =
@@ -87,7 +92,12 @@
 objSetPropertyAtIndex this index val = do
     vref <- toJSVal val
     js_trySetAtIndex index this vref
-foreign import javascript unsafe "$2[$1]=$3"
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2,$3) => { return $2[$1]=$3; })"
+#else
+  "$2[$1]=$3"
+#endif
     js_trySetAtIndex :: Int -> Object -> JSVal -> IO ()
 #else
 objSetPropertyAtIndex this index val =
diff --git a/src/Language/Javascript/JSaddle/Value.hs b/src/Language/Javascript/JSaddle/Value.hs
--- a/src/Language/Javascript/JSaddle/Value.hs
+++ b/src/Language/Javascript/JSaddle/Value.hs
@@ -189,8 +189,14 @@
 valToNumber :: ToJSVal value => value -> JSM Double
 #ifdef ghcjs_HOST_OS
 valToNumber value = jsrefToNumber <$> toJSVal value
-foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return Number($1); })"
 #else
+  "$r = Number($1);"
+#endif
+     jsrefToNumber :: JSVal -> Double
+#else
 valToNumber value = toJSVal value >>= valueToNumber
 #endif
 
@@ -216,8 +222,14 @@
 valToStr :: ToJSVal value => value -> JSM JSString
 #ifdef ghcjs_HOST_OS
 valToStr value = jsrefToString <$> toJSVal value
-foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSString
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return $1.toString(); })"
 #else
+  "$r = $1.toString();"
+#endif
+    jsrefToString :: JSVal -> JSString
+#else
 valToStr value = toJSVal value >>= valueToString
 #endif
 
@@ -267,8 +279,14 @@
 valToJSON :: ToJSVal value => value -> JSM JSString
 #ifdef ghcjs_HOST_OS
 valToJSON value = jsrefToJSON <$> toJSVal value
-foreign import javascript unsafe "$r = $1 === undefined ? \"\" : JSON.stringify($1);" jsrefToJSON :: JSVal -> JSString
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return $1 === undefined ? \"\" : JSON.stringify($1); })"
 #else
+  "$r = $1 === undefined ? \"\" : JSON.stringify($1);"
+#endif
+    jsrefToJSON :: JSVal -> JSString
+#else
 valToJSON value = toJSVal value >>= valueToJSON
 #endif
 
@@ -611,13 +629,24 @@
         4 -> ValString <$> valToText valref
         5 -> ValObject <$> valToObject valref
         _ -> error "Unexpected result dereferencing JSaddle value"
-foreign import javascript unsafe "$r = ($1 === undefined)?0:\
-                                       ($1===null)?1:\
-                                       (typeof $1===\"boolean\")?2:\
-                                       (typeof $1===\"number\")?3:\
-                                       (typeof $1===\"string\")?4:\
-                                       (typeof $1===\"object\")?5:-1;" jsrefGetType :: JSVal -> Int
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1) => { return ($1 === undefined)?0:\
+                     ($1===null)?1:\
+                     (typeof $1===\"boolean\")?2:\
+                     (typeof $1===\"number\")?3:\
+                     (typeof $1===\"string\")?4:\
+                     (typeof $1===\"object\")?5:-1; })"
 #else
+  "$r = ($1 === undefined)?0:\
+        ($1===null)?1:\
+        (typeof $1===\"boolean\")?2:\
+        (typeof $1===\"number\")?3:\
+        (typeof $1===\"string\")?4:\
+        (typeof $1===\"object\")?5:-1;"
+#endif
+    jsrefGetType :: JSVal -> Int
+#else
 deRefVal value = do
     v <- toJSVal value
     result <- N.deRefVal v
@@ -669,8 +698,13 @@
 
 #ifdef ghcjs_HOST_OS
 foreign import javascript unsafe
-  "$1===$2" jsvalueisstrictequal :: JSVal -> JSVal -> Bool
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2) => { return $1===$2; })"
+#else
+  "$1===$2"
 #endif
+    jsvalueisstrictequal :: JSVal -> JSVal -> Bool
+#endif
 
 -- | Determine if two values are equal (JavaScripts ===)
 -- >>> testJSaddle $ strictEqual True False
@@ -692,7 +726,12 @@
 #endif
 
 #ifdef ghcjs_HOST_OS
-foreign import javascript unsafe "$1 instanceof $2"
+foreign import javascript unsafe
+#if __GLASGOW_HASKELL__ >= 900
+  "(($1,$2) => { return $1 instanceof $2; })"
+#else
+  "$1 instanceof $2"
+#endif
   js_isInstanceOf :: JSVal -> Object -> Bool
 #endif
 
