diff --git a/jsaddle-dom.cabal b/jsaddle-dom.cabal
--- a/jsaddle-dom.cabal
+++ b/jsaddle-dom.cabal
@@ -1,5 +1,5 @@
 name: jsaddle-dom
-version: 0.6.0.0
+version: 0.7.0.0
 cabal-version: >=1.22
 build-type: Simple
 license: MIT
@@ -1072,7 +1072,7 @@
         base-compat >=0.9.0 && <0.10,
         transformers >=0.2 && <0.6,
         text >=0.11.0.6 && <1.3,
-        jsaddle >=0.6.0.0 && <0.7,
+        jsaddle >=0.7.0.0 && <0.8,
         lens >=4.12.3 && <4.16
     default-language: Haskell2010
     hs-source-dirs: src
diff --git a/src/JSDOM/Generated/ANGLEInstancedArrays.hs b/src/JSDOM/Generated/ANGLEInstancedArrays.hs
--- a/src/JSDOM/Generated/ANGLEInstancedArrays.hs
+++ b/src/JSDOM/Generated/ANGLEInstancedArrays.hs
@@ -39,8 +39,8 @@
   = liftDOM
       (void
          (self ^. jsf "drawElementsInstancedANGLE"
-            [toJSVal mode, toJSVal count, toJSVal type', toJSVal offset,
-             toJSVal primcount]))
+            [toJSVal mode, toJSVal count, toJSVal type',
+             integralToDoubleToJSVal offset, toJSVal primcount]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/ANGLEInstancedArrays.vertexAttribDivisorANGLE Mozilla ANGLEInstancedArrays.vertexAttribDivisorANGLE documentation> 
 vertexAttribDivisorANGLE ::
diff --git a/src/JSDOM/Generated/Blob.hs b/src/JSDOM/Generated/Blob.hs
--- a/src/JSDOM/Generated/Blob.hs
+++ b/src/JSDOM/Generated/Blob.hs
@@ -39,7 +39,8 @@
 slice self start end contentType
   = liftDOM
       (((toBlob self) ^. jsf "slice"
-          [toJSVal start, toJSVal end, toJSVal contentType])
+          [integralToDoubleToJSVal start, integralToDoubleToJSVal end,
+           toJSVal contentType])
          >>= fromJSVal)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/Blob.slice Mozilla Blob.slice documentation> 
@@ -50,7 +51,8 @@
   = liftDOM
       (void
          ((toBlob self) ^. jsf "slice"
-            [toJSVal start, toJSVal end, toJSVal contentType]))
+            [integralToDoubleToJSVal start, integralToDoubleToJSVal end,
+             toJSVal contentType]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/Blob.slice Mozilla Blob.slice documentation> 
 sliceUnsafe ::
@@ -59,7 +61,8 @@
 sliceUnsafe self start end contentType
   = liftDOM
       ((((toBlob self) ^. jsf "slice"
-           [toJSVal start, toJSVal end, toJSVal contentType])
+           [integralToDoubleToJSVal start, integralToDoubleToJSVal end,
+            toJSVal contentType])
           >>= fromJSVal)
          >>= maybe (Prelude.error "Nothing to return") return)
 
@@ -70,7 +73,8 @@
 sliceUnchecked self start end contentType
   = liftDOM
       (((toBlob self) ^. jsf "slice"
-          [toJSVal start, toJSVal end, toJSVal contentType])
+          [integralToDoubleToJSVal start, integralToDoubleToJSVal end,
+           toJSVal contentType])
          >>= fromJSValUnchecked)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/Blob.size Mozilla Blob.size documentation> 
diff --git a/src/JSDOM/Generated/IDBFactory.hs b/src/JSDOM/Generated/IDBFactory.hs
--- a/src/JSDOM/Generated/IDBFactory.hs
+++ b/src/JSDOM/Generated/IDBFactory.hs
@@ -26,8 +26,9 @@
        IDBFactory -> name -> Word64 -> m (Maybe IDBOpenDBRequest)
 open self name version
   = liftDOM
-      ((self ^. jsf "open" [toJSVal name, toJSVal version]) >>=
-         fromJSVal)
+      ((self ^. jsf "open"
+          [toJSVal name, integralToDoubleToJSVal version])
+         >>= fromJSVal)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory.open Mozilla IDBFactory.open documentation> 
 open_ ::
@@ -35,7 +36,9 @@
         IDBFactory -> name -> Word64 -> m ()
 open_ self name version
   = liftDOM
-      (void (self ^. jsf "open" [toJSVal name, toJSVal version]))
+      (void
+         (self ^. jsf "open"
+            [toJSVal name, integralToDoubleToJSVal version]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory.open Mozilla IDBFactory.open documentation> 
 openUnsafe ::
@@ -43,8 +46,9 @@
              IDBFactory -> name -> Word64 -> m IDBOpenDBRequest
 openUnsafe self name version
   = liftDOM
-      (((self ^. jsf "open" [toJSVal name, toJSVal version]) >>=
-          fromJSVal)
+      (((self ^. jsf "open"
+           [toJSVal name, integralToDoubleToJSVal version])
+          >>= fromJSVal)
          >>= maybe (Prelude.error "Nothing to return") return)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory.open Mozilla IDBFactory.open documentation> 
@@ -53,8 +57,9 @@
                 IDBFactory -> name -> Word64 -> m IDBOpenDBRequest
 openUnchecked self name version
   = liftDOM
-      ((self ^. jsf "open" [toJSVal name, toJSVal version]) >>=
-         fromJSValUnchecked)
+      ((self ^. jsf "open"
+          [toJSVal name, integralToDoubleToJSVal version])
+         >>= fromJSValUnchecked)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBFactory.deleteDatabase Mozilla IDBFactory.deleteDatabase documentation> 
 deleteDatabase ::
diff --git a/src/JSDOM/Generated/IDBVersionChangeEvent.hs b/src/JSDOM/Generated/IDBVersionChangeEvent.hs
--- a/src/JSDOM/Generated/IDBVersionChangeEvent.hs
+++ b/src/JSDOM/Generated/IDBVersionChangeEvent.hs
@@ -29,18 +29,21 @@
 getNewVersion ::
               (MonadDOM m) => IDBVersionChangeEvent -> m (Maybe Word64)
 getNewVersion self
-  = liftDOM ((self ^. js "newVersion") >>= fromJSVal)
+  = liftDOM
+      ((self ^. js "newVersion") >>= integralFromDoubleFromJSVal)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeEvent.newVersion Mozilla IDBVersionChangeEvent.newVersion documentation> 
 getNewVersionUnsafe ::
                     (MonadDOM m, HasCallStack) => IDBVersionChangeEvent -> m Word64
 getNewVersionUnsafe self
   = liftDOM
-      (((self ^. js "newVersion") >>= fromJSVal) >>=
+      (((self ^. js "newVersion") >>= integralFromDoubleFromJSVal) >>=
          maybe (Prelude.error "Nothing to return") return)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeEvent.newVersion Mozilla IDBVersionChangeEvent.newVersion documentation> 
 getNewVersionUnchecked ::
                        (MonadDOM m) => IDBVersionChangeEvent -> m Word64
 getNewVersionUnchecked self
-  = liftDOM ((self ^. js "newVersion") >>= fromJSValUnchecked)
+  = liftDOM
+      ((self ^. js "newVersion") >>=
+         integralFromDoubleFromJSValUnchecked)
diff --git a/src/JSDOM/Generated/Internals.hs b/src/JSDOM/Generated/Internals.hs
--- a/src/JSDOM/Generated/Internals.hs
+++ b/src/JSDOM/Generated/Internals.hs
@@ -2036,7 +2036,8 @@
 setApplicationCacheOriginQuota self quota
   = liftDOM
       (void
-         (self ^. jsf "setApplicationCacheOriginQuota" [toJSVal quota]))
+         (self ^. jsf "setApplicationCacheOriginQuota"
+            [integralToDoubleToJSVal quota]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/Internals.registerURLSchemeAsBypassingContentSecurityPolicy Mozilla Internals.registerURLSchemeAsBypassingContentSecurityPolicy documentation> 
 registerURLSchemeAsBypassingContentSecurityPolicy ::
diff --git a/src/JSDOM/Generated/StorageInfo.hs b/src/JSDOM/Generated/StorageInfo.hs
--- a/src/JSDOM/Generated/StorageInfo.hs
+++ b/src/JSDOM/Generated/StorageInfo.hs
@@ -44,7 +44,7 @@
   = liftDOM
       (void
          (self ^. jsf "requestQuota"
-            [toJSVal storageType, toJSVal newQuotaInBytes,
+            [toJSVal storageType, integralToDoubleToJSVal newQuotaInBytes,
              toJSVal quotaCallback, toJSVal errorCallback]))
 pattern TEMPORARY = 0
 pattern PERSISTENT = 1
diff --git a/src/JSDOM/Generated/StorageQuota.hs b/src/JSDOM/Generated/StorageQuota.hs
--- a/src/JSDOM/Generated/StorageQuota.hs
+++ b/src/JSDOM/Generated/StorageQuota.hs
@@ -40,5 +40,5 @@
   = liftDOM
       (void
          (self ^. jsf "requestQuota"
-            [toJSVal newQuotaInBytes, toJSVal quotaCallback,
+            [integralToDoubleToJSVal newQuotaInBytes, toJSVal quotaCallback,
              toJSVal errorCallback]))
diff --git a/src/JSDOM/Generated/TypeConversions.hs b/src/JSDOM/Generated/TypeConversions.hs
--- a/src/JSDOM/Generated/TypeConversions.hs
+++ b/src/JSDOM/Generated/TypeConversions.hs
@@ -83,7 +83,8 @@
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/TypeConversions.testLongLong Mozilla TypeConversions.testLongLong documentation> 
 setTestLongLong :: (MonadDOM m) => TypeConversions -> Int64 -> m ()
 setTestLongLong self val
-  = liftDOM (self ^. jss "testLongLong" (toJSVal val))
+  = liftDOM
+      (self ^. jss "testLongLong" (integralToDoubleToJSVal val))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/TypeConversions.testLongLong Mozilla TypeConversions.testLongLong documentation> 
 getTestLongLong :: (MonadDOM m) => TypeConversions -> m Int64
@@ -94,7 +95,9 @@
 setTestEnforceRangeLongLong ::
                             (MonadDOM m) => TypeConversions -> Int64 -> m ()
 setTestEnforceRangeLongLong self val
-  = liftDOM (self ^. jss "testEnforceRangeLongLong" (toJSVal val))
+  = liftDOM
+      (self ^. jss "testEnforceRangeLongLong"
+         (integralToDoubleToJSVal val))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/TypeConversions.testEnforceRangeLongLong Mozilla TypeConversions.testEnforceRangeLongLong documentation> 
 getTestEnforceRangeLongLong ::
@@ -108,7 +111,8 @@
 setTestUnsignedLongLong ::
                         (MonadDOM m) => TypeConversions -> Word64 -> m ()
 setTestUnsignedLongLong self val
-  = liftDOM (self ^. jss "testUnsignedLongLong" (toJSVal val))
+  = liftDOM
+      (self ^. jss "testUnsignedLongLong" (integralToDoubleToJSVal val))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/TypeConversions.testUnsignedLongLong Mozilla TypeConversions.testUnsignedLongLong documentation> 
 getTestUnsignedLongLong ::
@@ -122,7 +126,8 @@
                                     (MonadDOM m) => TypeConversions -> Word64 -> m ()
 setTestEnforceRangeUnsignedLongLong self val
   = liftDOM
-      (self ^. jss "testEnforceRangeUnsignedLongLong" (toJSVal val))
+      (self ^. jss "testEnforceRangeUnsignedLongLong"
+         (integralToDoubleToJSVal val))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/TypeConversions.testEnforceRangeUnsignedLongLong Mozilla TypeConversions.testEnforceRangeUnsignedLongLong documentation> 
 getTestEnforceRangeUnsignedLongLong ::
diff --git a/src/JSDOM/Generated/WebGL2RenderingContext.hs b/src/JSDOM/Generated/WebGL2RenderingContext.hs
--- a/src/JSDOM/Generated/WebGL2RenderingContext.hs
+++ b/src/JSDOM/Generated/WebGL2RenderingContext.hs
@@ -222,8 +222,10 @@
   = liftDOM
       (void
          (self ^. jsf "copyBufferSubData"
-            [toJSVal readTarget, toJSVal writeTarget, toJSVal readOffset,
-             toJSVal writeOffset, toJSVal size]))
+            [toJSVal readTarget, toJSVal writeTarget,
+             integralToDoubleToJSVal readOffset,
+             integralToDoubleToJSVal writeOffset,
+             integralToDoubleToJSVal size]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.getBufferSubData Mozilla WebGL2RenderingContext.getBufferSubData documentation> 
 getBufferSubDataView ::
@@ -234,7 +236,8 @@
   = liftDOM
       (void
          (self ^. jsf "getBufferSubData"
-            [toJSVal target, toJSVal offset, toJSVal returnedData]))
+            [toJSVal target, integralToDoubleToJSVal offset,
+             toJSVal returnedData]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.getBufferSubData Mozilla WebGL2RenderingContext.getBufferSubData documentation> 
 getBufferSubData ::
@@ -245,7 +248,8 @@
   = liftDOM
       (void
          (self ^. jsf "getBufferSubData"
-            [toJSVal target, toJSVal offset, toJSVal returnedData]))
+            [toJSVal target, integralToDoubleToJSVal offset,
+             toJSVal returnedData]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.getFramebufferAttachmentParameter Mozilla WebGL2RenderingContext.getFramebufferAttachmentParameter documentation> 
 getFramebufferAttachmentParameter ::
@@ -763,7 +767,7 @@
       (void
          (self ^. jsf "vertexAttribIPointer"
             [toJSVal index, toJSVal size, toJSVal type', toJSVal stride,
-             toJSVal offset]))
+             integralToDoubleToJSVal offset]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.vertexAttribDivisor Mozilla WebGL2RenderingContext.vertexAttribDivisor documentation> 
 vertexAttribDivisor ::
@@ -795,8 +799,8 @@
   = liftDOM
       (void
          (self ^. jsf "drawElementsInstanced"
-            [toJSVal mode, toJSVal count, toJSVal type', toJSVal offset,
-             toJSVal instanceCount]))
+            [toJSVal mode, toJSVal count, toJSVal type',
+             integralToDoubleToJSVal offset, toJSVal instanceCount]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.drawRangeElements Mozilla WebGL2RenderingContext.drawRangeElements documentation> 
 drawRangeElements ::
@@ -808,7 +812,7 @@
       (void
          (self ^. jsf "drawRangeElements"
             [toJSVal mode, toJSVal start, toJSVal end, toJSVal count,
-             toJSVal type', toJSVal offset]))
+             toJSVal type', integralToDoubleToJSVal offset]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.drawBuffers Mozilla WebGL2RenderingContext.drawBuffers documentation> 
 drawBuffers ::
@@ -1135,7 +1139,7 @@
 clientWaitSync self sync flags timeout
   = liftDOM
       ((self ^. jsf "clientWaitSync"
-          [toJSVal sync, toJSVal flags, toJSVal timeout])
+          [toJSVal sync, toJSVal flags, integralToDoubleToJSVal timeout])
          >>= fromJSValUnchecked)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.clientWaitSync Mozilla WebGL2RenderingContext.clientWaitSync documentation> 
@@ -1147,7 +1151,7 @@
   = liftDOM
       (void
          (self ^. jsf "clientWaitSync"
-            [toJSVal sync, toJSVal flags, toJSVal timeout]))
+            [toJSVal sync, toJSVal flags, integralToDoubleToJSVal timeout]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.waitSync Mozilla WebGL2RenderingContext.waitSync documentation> 
 waitSync ::
@@ -1158,7 +1162,7 @@
   = liftDOM
       (void
          (self ^. jsf "waitSync"
-            [toJSVal sync, toJSVal flags, toJSVal timeout]))
+            [toJSVal sync, toJSVal flags, integralToDoubleToJSVal timeout]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.getSyncParameter Mozilla WebGL2RenderingContext.getSyncParameter documentation> 
 getSyncParameter ::
@@ -1345,8 +1349,8 @@
   = liftDOM
       (void
          (self ^. jsf "bindBufferRange"
-            [toJSVal target, toJSVal index, toJSVal buffer, toJSVal offset,
-             toJSVal size]))
+            [toJSVal target, toJSVal index, toJSVal buffer,
+             integralToDoubleToJSVal offset, integralToDoubleToJSVal size]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext.getIndexedParameter Mozilla WebGL2RenderingContext.getIndexedParameter documentation> 
 getIndexedParameter ::
diff --git a/src/JSDOM/Generated/WebGLRenderingContextBase.hs b/src/JSDOM/Generated/WebGLRenderingContextBase.hs
--- a/src/JSDOM/Generated/WebGLRenderingContextBase.hs
+++ b/src/JSDOM/Generated/WebGLRenderingContextBase.hs
@@ -370,7 +370,7 @@
   = liftDOM
       (void
          ((toWebGLRenderingContextBase self) ^. jsf "bufferData"
-            [toJSVal target, toJSVal size, toJSVal usage]))
+            [toJSVal target, integralToDoubleToJSVal size, toJSVal usage]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.bufferSubData Mozilla WebGLRenderingContextBase.bufferSubData documentation> 
 bufferSubData ::
@@ -381,7 +381,7 @@
   = liftDOM
       (void
          ((toWebGLRenderingContextBase self) ^. jsf "bufferSubData"
-            [toJSVal target, toJSVal offset, toJSVal data']))
+            [toJSVal target, integralToDoubleToJSVal offset, toJSVal data']))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.bufferSubData Mozilla WebGLRenderingContextBase.bufferSubData documentation> 
 bufferSubDataView ::
@@ -392,7 +392,7 @@
   = liftDOM
       (void
          ((toWebGLRenderingContextBase self) ^. jsf "bufferSubData"
-            [toJSVal target, toJSVal offset, toJSVal data']))
+            [toJSVal target, integralToDoubleToJSVal offset, toJSVal data']))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.checkFramebufferStatus Mozilla WebGLRenderingContextBase.checkFramebufferStatus documentation> 
 checkFramebufferStatus ::
@@ -913,7 +913,8 @@
   = liftDOM
       (void
          ((toWebGLRenderingContextBase self) ^. jsf "drawElements"
-            [toJSVal mode, toJSVal count, toJSVal type', toJSVal offset]))
+            [toJSVal mode, toJSVal count, toJSVal type',
+             integralToDoubleToJSVal offset]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.enable Mozilla WebGLRenderingContextBase.enable documentation> 
 enable ::
@@ -1615,7 +1616,7 @@
   = liftDOM
       (((toWebGLRenderingContextBase self) ^. jsf "getVertexAttribOffset"
           [toJSVal index, toJSVal pname])
-         >>= fromJSValUnchecked)
+         >>= integralFromDoubleFromJSValUnchecked)
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.getVertexAttribOffset Mozilla WebGLRenderingContextBase.getVertexAttribOffset documentation> 
 getVertexAttribOffset_ ::
@@ -2453,7 +2454,7 @@
       (void
          ((toWebGLRenderingContextBase self) ^. jsf "vertexAttribPointer"
             [toJSVal indx, toJSVal size, toJSVal type', toJSVal normalized,
-             toJSVal stride, toJSVal offset]))
+             toJSVal stride, integralToDoubleToJSVal offset]))
 
 -- | <https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContextBase.viewport Mozilla WebGLRenderingContextBase.viewport documentation> 
 viewport ::
diff --git a/src/JSDOM/Types.hs b/src/JSDOM/Types.hs
--- a/src/JSDOM/Types.hs
+++ b/src/JSDOM/Types.hs
@@ -18,6 +18,7 @@
 
   -- * JavaScript Value
   , JSVal(..), ToJSVal(..), FromJSVal(..), PToJSVal(..), PFromJSVal(..)
+  , integralToDoubleToJSVal, integralFromDoubleFromJSVal, integralFromDoubleFromJSValUnchecked
 
   -- * JavaScript String
   , JSString(..), ToJSString(..), FromJSString(..)
@@ -694,10 +695,12 @@
 import Data.Int (Int8, Int16, Int32, Int64)
 import Data.Word (Word8, Word16, Word32, Word64)
 import Data.Monoid ((<>))
+import GHCJS.Marshal (ToJSVal(..), FromJSVal(..))
+import GHCJS.Marshal.Pure (PToJSVal(..), PFromJSVal(..))
 import Language.Javascript.JSaddle
        (Object(..), valToBool, valNull, valToNumber, (!!), js, valToText,
         JSVal, JSString, JSM, maybeNullOrUndefined, maybeNullOrUndefined',
-        valToStr, jsg, ToJSString(..), strToText, MakeObject(..),
+        valToStr, jsg, ToJSString(..), FromJSString(..), strToText, MakeObject(..),
         Nullable(..), Function(..), freeFunction, instanceOf, JSContextRef,
         askJSM, runJSM, MonadJSM(..), liftJSM, strictEqual)
 import Foreign.Ptr (nullPtr)
@@ -708,9 +711,6 @@
 import Data.Coerce (coerce, Coercible)
 import Control.Monad.Trans.Reader (ReaderT(..), ask)
 import Control.Exception (bracket)
-#ifdef ghcjs_HOST_OS
-import GHCJS.Marshal.Pure (PToJSVal(..), PFromJSVal(..))
-#endif
 #if MIN_VERSION_base(4,9,0)
 import GHC.Stack (HasCallStack)
 #else
@@ -794,36 +794,13 @@
 toGObject :: IsGObject o => o -> GObject
 toGObject = GObject . coerce
 
-#ifndef ghcjs_HOST_OS
-class PToJSVal o where
-  pToJSVal :: o -> JSVal
-
-class PFromJSVal o where
-  pFromJSVal :: JSVal -> o
-#endif
-
---class ToJSVal o where
---  toJSVal :: o -> JSM JSVal
-
-class FromJSVal o where
-    fromJSVal :: JSVal -> JSM (Maybe o)
-    fromJSVal = maybeNullOrUndefined' fromJSValUnchecked
-
-    fromJSValUnchecked :: JSVal -> JSM o
-    fromJSValUnchecked v =
-        fromJSVal v >>= \case
-            Nothing -> error "fromJSValUnchecked"
-            Just r  -> return r
-
 fromJSArray :: FromJSVal o => JSVal -> JSM [Maybe o]
 fromJSArray a = do
     l <- a ^. js "length" >>= valToNumber
     mapM (\i -> a !! i >>= fromJSVal) [0..round l - 1]
 
 fromJSArrayUnchecked :: FromJSVal o => JSVal -> JSM [o]
-fromJSArrayUnchecked a = do
-    l <- a ^. js "length" >>= valToNumber
-    mapM (\i -> a !! i >>= fromJSValUnchecked) [0..round l - 1]
+fromJSArrayUnchecked = fromJSValUncheckedListOf
 
 -- newtype Nullable a = Nullable JSVal
 
@@ -887,17 +864,10 @@
 --   give it back as is.
 type DOMString = JSString
 
-class FromJSVal s => FromJSString s where
-    fromJSString :: JSString -> JSM s
-
 fromJSStringArray :: FromJSString s => JSVal -> JSM [s]
 fromJSStringArray a = do
     l <- a ^. js "length" >>= valToNumber
-    mapM (\i -> a !! i >>= valToStr >>= fromJSString) [0..round l - 1]
-
---fromJSString :: FromJSString a => JSString -> a
---fromJSString a = pFromJSVal . pToJSVal
---{-# INLINE fromJSString #-}
+    mapM (\i -> fromJSString <$> (a !! i >>= valToStr)) [0..round l - 1]
 
 toMaybeJSString :: ToJSString a => Maybe a -> JSM JSVal
 toMaybeJSString Nothing = return valNull
@@ -905,41 +875,17 @@
 {-# INLINE toMaybeJSString #-}
 
 fromMaybeJSString :: FromJSString a => JSVal -> JSM (Maybe a)
-fromMaybeJSString = maybeNullOrUndefined' (valToStr >=> fromJSString)
+fromMaybeJSString = maybeNullOrUndefined' (fmap fromJSString . valToStr)
 {-# INLINE fromMaybeJSString #-}
 
-instance FromJSVal JSVal where
-    fromJSValUnchecked = return
-instance FromJSVal Double where
-    fromJSValUnchecked = valToNumber
-instance FromJSVal Float where
-    fromJSValUnchecked v = realToFrac <$> valToNumber v
-instance FromJSVal Int where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Int32 where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Int64 where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Word where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Word32 where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Word64 where
-    fromJSValUnchecked v = round <$> valToNumber v
-instance FromJSVal Bool where
-    fromJSValUnchecked = valToBool
-instance FromJSVal T.Text where
-    fromJSValUnchecked v = strToText <$> valToStr v
-instance FromJSString T.Text where
-    fromJSString = return . strToText
-instance FromJSVal String where
-    fromJSValUnchecked v = T.unpack . strToText <$> valToStr v
-instance FromJSString String where
-    fromJSString v = return . T.unpack $ strToText v
-instance FromJSVal JSString where
-    fromJSValUnchecked = valToStr
-instance FromJSString JSString where
-    fromJSString = return
+integralToDoubleToJSVal :: Integral a => a -> JSM JSVal
+integralToDoubleToJSVal a = toJSVal (fromIntegral a :: Double)
+
+integralFromDoubleFromJSVal :: Integral a => JSVal -> JSM (Maybe a)
+integralFromDoubleFromJSVal = fmap (fmap round) . (fromJSVal :: JSVal -> JSM (Maybe Double))
+
+integralFromDoubleFromJSValUnchecked :: Integral a => JSVal -> JSM a
+integralFromDoubleFromJSValUnchecked = fmap round . (fromJSValUnchecked :: JSVal -> JSM Double)
 
 type ToDOMString s = ToJSString s
 type FromDOMString s = FromJSString s
