diff --git a/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs b/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
index b2cc19b9f5e83d9225c7b6acf4c8588e720ce140..46f5b6deac5b802830f08feae79c0cbdaec0dd84 100644
--- a/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
+++ b/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs
@@ -82,7 +82,7 @@ newtype JSVal#
   = JSVal# (Any :: UnliftedType)
 
 data JSVal
-  = forall a . JSVal JSVal# (Weak# JSVal#) (StablePtr# a)
+  = forall a . JSVal JSVal# (Weak# JSVal) (StablePtr# a)
 
 freeJSVal :: JSVal -> IO ()
 freeJSVal v@(JSVal _ w sp) = do
diff --git a/rts/wasm/JSFFI.c b/rts/wasm/JSFFI.c
index 56e260d95004b2a00bcd82ea1c4f1b9ac7d04fbc..ba824200021f3867a5e67ca3ad8d16e8ad09613e 100644
--- a/rts/wasm/JSFFI.c
+++ b/rts/wasm/JSFFI.c
@@ -107,7 +107,6 @@ HaskellObj rts_mkJSVal(Capability *cap, HsJSVal v) {
   SET_HDR(w, &stg_WEAK_info, CCS_SYSTEM);
   w->cfinalizers = (StgClosure *)cfin;
   w->key = p;
-  w->value = Unit_closure;
   w->finalizer = &stg_NO_FINALIZER_closure;
   w->link = cap->weak_ptr_list_hd;
   cap->weak_ptr_list_hd = w;
@@ -120,7 +119,9 @@ HaskellObj rts_mkJSVal(Capability *cap, HsJSVal v) {
   box->payload[0] = p;
   box->payload[1] = (HaskellObj)w;
   box->payload[2] = NULL;
-  return TAG_CLOSURE(1, box);
+
+  w->value = TAG_CLOSURE(1, box);
+  return w->value;
 }
 
 __attribute__((import_module("ghc_wasm_jsffi"), import_name("getJSVal")))
diff --git a/testsuite/tests/jsffi/jsffigc.hs b/testsuite/tests/jsffi/jsffigc.hs
index a7427cad17c1700769d55c6be2980f288d4a2d53..f260e10f6eb292157e15d61c3cf5680cf3107068 100644
--- a/testsuite/tests/jsffi/jsffigc.hs
+++ b/testsuite/tests/jsffi/jsffigc.hs
@@ -27,7 +27,7 @@ foreign export javascript "testDynExportFree sync"
 -- JSVal#. Do not use this in your own codebase since this is purely
 -- an implementation detail of JSVal and subject to change!
 jsvalWeak :: JSVal -> Weak JSVal
-jsvalWeak (JSVal _ w _) = Weak $ unsafeCoerce# Weak w
+jsvalWeak (JSVal _ w _) = Weak w
 
 probeWeak :: Weak v -> IO ()
 probeWeak wk = print =<< isJust <$> deRefWeak wk