diff --git a/ghc/lib/exts/Weak.lhs b/ghc/lib/exts/Weak.lhs
index be0c0251ff92493811091408e7163f872c5fff43..dbbe34a8a31566fcf5703f655dbdebbbaf687087 100644
--- a/ghc/lib/exts/Weak.lhs
+++ b/ghc/lib/exts/Weak.lhs
@@ -2,18 +2,16 @@
 % (c) The AQUA Project, Glasgow University, 1998
 %
 
-\section[Weak]{Module @PrelWeak@}
+\section[Weak]{Module @Weak@}
 
 \begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
-
 module Weak (
 	Weak,	    		-- abstract
 	-- instance Eq (Weak v)  
 
 	mkWeak,      		-- :: k -> v -> IO () -> IO (Weak v)
 	deRefWeak, 		-- :: Weak v -> IO (Maybe v)
-	-- finalise		-- :: Weak v -> IO ()
+	finalise,		-- :: Weak v -> IO ()
 	-- replaceFinaliser	-- :: Weak v -> IO () -> IO ()
 	mkWeakNoFinaliser,	-- :: k -> v -> IO (Weak v)
 
@@ -23,6 +21,28 @@ module Weak (
 	addForeignFinaliser 	-- :: ForeignObj -> IO () -> IO ()
    ) where
 
+import PrelBase
+import PrelIOBase
 import PrelWeak
 import Foreign
+
+deRefWeak :: Weak v -> IO (Maybe v)
+deRefWeak (Weak w) = IO $ \s ->
+   case deRefWeak# w s of
+	(# s1, flag, p #) -> case flag of
+				0# -> (# s1, Nothing #)
+				_  -> (# s1, Just p #)
+
+mkWeakNoFinaliser key val = IO $ \s ->
+   -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
+   case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
+   (# s1, Weak w #) }
+
+mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
+mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
+
+finalise :: Weak v -> IO ()
+finalise (Weak w) = IO $ \s ->
+   case finaliseWeak# w s of s1 -> (# s1, () #)
+
 \end{code}
diff --git a/ghc/lib/std/PrelWeak.lhs b/ghc/lib/std/PrelWeak.lhs
index d6844605dc435aebca93f272414f0452aa650e26..901a3857265e8fa084fa83a871ff13396c131851 100644
--- a/ghc/lib/std/PrelWeak.lhs
+++ b/ghc/lib/std/PrelWeak.lhs
@@ -10,7 +10,6 @@
 module PrelWeak where
 
 import PrelGHC
-import PrelMaybe
 import PrelBase
 import PrelIOBase
 import PrelForeign
@@ -26,24 +25,9 @@ mkWeak key val finaliser = IO $ \s ->
    case mkWeak# key val finaliser s of { (# s1, w #) ->
    (# s1, Weak w #) }
 
-mkWeakNoFinaliser key val = IO $ \s ->
-   -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
-   case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
-   (# s1, Weak w #) }
-
-deRefWeak :: Weak v -> IO (Maybe v)
-deRefWeak (Weak w) = IO $ \s ->
-   case deRefWeak# w s of
-	(# s1, flag, p #) -> case flag of
-				0# -> (# s1, Nothing #)
-				_  -> (# s1, Just p #)
-
 mkWeakPtr :: k -> IO () -> IO (Weak k)
 mkWeakPtr key finaliser = mkWeak key key finaliser
 
-mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
-mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
-
 addFinaliser :: key -> IO () -> IO ()
 addFinaliser key finaliser = do
    mkWeakPtr key finaliser		-- throw it away
@@ -53,9 +37,6 @@ addForeignFinaliser :: ForeignObj -> IO () -> IO ()
 addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
 
 {-
-finalise :: Weak v -> IO ()
-finalise (Weak w) = finaliseWeak# w
-
 instance Eq (Weak v) where
   (Weak w1) == (Weak w2) = w1 `sameWeak#` w2
 -}