diff --git a/GHC/Integer.lhs b/GHC/Integer.lhs
index 392d3de79cb9e7862ea729f74281c3d309a80858..bc61d0394d2344a6aa823419c256bc47c7e41ee0 100644
--- a/GHC/Integer.lhs
+++ b/GHC/Integer.lhs
@@ -18,7 +18,7 @@
 #include "MachDeps.h"
 
 module GHC.Integer (
-    Integer,
+    Integer, mkInteger,
     smallInteger, wordToInteger, integerToWord, integerToInt,
 #if WORD_SIZE_IN_BITS < 64
     integerToWord64, word64ToInteger,
diff --git a/GHC/Integer/Type.lhs b/GHC/Integer/Type.lhs
index eef256b2745d91c68a603ea107781b7f0ae5f02e..401544d20526121bacbe2eab33ec6be3c9e4051e 100644
--- a/GHC/Integer/Type.lhs
+++ b/GHC/Integer/Type.lhs
@@ -72,6 +72,16 @@ data Integer
    = S# Int#                            -- small integers
    | J# Int# ByteArray#                 -- large integers
 
+mkInteger :: Bool   -- non-negative?
+          -> [Int]  -- absolute value in 31 bit chunks, least significant first
+                    -- ideally these would be Words rather than Ints, but
+                    -- we don't have Word available at the moment.
+          -> Integer
+mkInteger nonNegative is = let abs = f is
+                           in if nonNegative then abs else negateInteger abs
+    where f [] = S# 0#
+          f (I# i : is') = S# i `orInteger` shiftLInteger (f is') 31#
+
 {-# NOINLINE smallInteger #-}
 smallInteger :: Int# -> Integer
 smallInteger i = S# i