diff --git a/ghc/lib/std/PrelHandle.lhs b/ghc/lib/std/PrelHandle.lhs
index 10886a0bd37ca1aa862020cc789ea9f7b0b2c50d..6fba7e0681a0d6a2329d52f3a08ee86f56d2346a 100644
--- a/ghc/lib/std/PrelHandle.lhs
+++ b/ghc/lib/std/PrelHandle.lhs
@@ -23,7 +23,7 @@ import PrelException 	( throw, ioError, catchException )
 import PrelMaybe	( Maybe(..) )
 import PrelAddr		( Addr, nullAddr )
 import PrelBounded      ()   -- get at Bounded Int instance.
-import PrelNum		( toInteger )
+import PrelNum		( toInteger, toBig )
 import PrelWeak		( addForeignFinalizer )
 #if __CONCURRENT_HASKELL__
 import PrelConc
@@ -434,12 +434,12 @@ hFileSize handle =
 	  -- For some reason, this fails to typecheck if converted to a do
 	  -- expression --SDM
           _casm_ ``%r = 1;'' >>= \(I# hack#) ->
-          case int2Integer hack# of
-            result@(J# _ d#) -> do
-                rc <- CCALL(fileSize) (haFO__ handle_) d#  -- ConcHask: SAFE, won't block
+          case int2Integer# hack# of
+              (# s, d #) -> do
+                rc <- CCALL(fileSize) (haFO__ handle_) d  -- ConcHask: SAFE, won't block
                 writeHandle handle handle_
                 if rc == (0::Int) then
-		   return result
+		   return (J# s d)
                  else
 		   constructErrorAndFail "hFileSize"
 #endif
@@ -641,6 +641,7 @@ hSeek handle mode offset =
     let fo = haFO__ handle_
     rc      <- mayBlock fo (CCALL(seekFile_int64) fo whence (primIntegerToInt64 offset))  -- ConcHask: UNSAFE, may block
 #else
+hSeek handle mode i@(S# _) = hSeek handle mode (toBig i)
 hSeek handle mode (J# s# d#) =
     wantSeekableHandle "hSeek" handle $ \ handle_ -> do
     let fo = haFO__ handle_