diff --git a/Array.hs b/Array.hs
new file mode 100644
--- /dev/null
+++ b/Array.hs
@@ -0,0 +1,8 @@
+module Array (
+    module Ix,  -- export all of Ix for convenience
+    Array, array, listArray, (!), bounds, indices, elems, assocs, 
+    accumArray, (//), accum, ixmap
+  ) where
+
+import Ix
+import Data.Array
diff --git a/Bits.hs b/Bits.hs
new file mode 100644
--- /dev/null
+++ b/Bits.hs
@@ -0,0 +1,3 @@
+module Bits (module Data.Bits) where
+import Data.Bits
+
diff --git a/CError.hs b/CError.hs
new file mode 100644
--- /dev/null
+++ b/CError.hs
@@ -0,0 +1,2 @@
+module CError (module Foreign.C.Error) where
+import Foreign.C.Error
diff --git a/CForeign.hs b/CForeign.hs
new file mode 100644
--- /dev/null
+++ b/CForeign.hs
@@ -0,0 +1,2 @@
+module CForeign ( module Foreign.C ) where
+import Foreign.C
diff --git a/CPUTime.hs b/CPUTime.hs
new file mode 100644
--- /dev/null
+++ b/CPUTime.hs
@@ -0,0 +1,5 @@
+module CPUTime (
+    getCPUTime, cpuTimePrecision 
+  ) where
+
+import System.CPUTime
diff --git a/CString.hs b/CString.hs
new file mode 100644
--- /dev/null
+++ b/CString.hs
@@ -0,0 +1,2 @@
+module CString (module Foreign.C.String) where
+import Foreign.C.String
diff --git a/CTypes.hs b/CTypes.hs
new file mode 100644
--- /dev/null
+++ b/CTypes.hs
@@ -0,0 +1,2 @@
+module CTypes (module Foreign.C.Types) where
+import Foreign.C.Types
diff --git a/Char.hs b/Char.hs
new file mode 100644
--- /dev/null
+++ b/Char.hs
@@ -0,0 +1,13 @@
+module Char (
+    isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower, 
+    isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum, 
+    digitToInt, intToDigit,
+    toUpper, toLower,
+    ord, chr,
+    readLitChar, showLitChar, lexLitChar,
+
+-- ...and what the Prelude exports
+    Char, String
+  ) where
+
+import Data.Char
diff --git a/Complex.hs b/Complex.hs
new file mode 100644
--- /dev/null
+++ b/Complex.hs
@@ -0,0 +1,6 @@
+module Complex (
+    Complex((:+)), realPart, imagPart, conjugate, 
+    mkPolar, cis, polar, magnitude, phase 
+  ) where
+
+import Data.Complex
diff --git a/Directory.hs b/Directory.hs
new file mode 100644
--- /dev/null
+++ b/Directory.hs
@@ -0,0 +1,11 @@
+module Directory (
+    Permissions( Permissions, readable, writable, executable, searchable ), 
+    createDirectory, removeDirectory, removeFile, 
+    renameDirectory, renameFile, getDirectoryContents,
+    getCurrentDirectory, setCurrentDirectory,
+    doesFileExist, doesDirectoryExist,
+    getPermissions, setPermissions,
+    getModificationTime 
+  ) where
+
+import System.Directory
diff --git a/ForeignPtr.hs b/ForeignPtr.hs
new file mode 100644
--- /dev/null
+++ b/ForeignPtr.hs
@@ -0,0 +1,2 @@
+module ForeignPtr (module Foreign.ForeignPtr) where
+import Foreign.ForeignPtr
diff --git a/IO.hs b/IO.hs
new file mode 100644
--- /dev/null
+++ b/IO.hs
@@ -0,0 +1,58 @@
+module IO (
+    Handle, HandlePosn,
+    IOMode(ReadMode,WriteMode,AppendMode,ReadWriteMode),
+    BufferMode(NoBuffering,LineBuffering,BlockBuffering),
+    SeekMode(AbsoluteSeek,RelativeSeek,SeekFromEnd),
+    stdin, stdout, stderr, 
+    openFile, hClose, hFileSize, hIsEOF, isEOF,
+    hSetBuffering, hGetBuffering, hFlush, 
+    hGetPosn, hSetPosn, hSeek, 
+    hWaitForInput, hReady, hGetChar, hGetLine, hLookAhead, hGetContents, 
+    hPutChar, hPutStr, hPutStrLn, hPrint,
+    hIsOpen, hIsClosed, hIsReadable, hIsWritable, hIsSeekable,
+    isAlreadyExistsError, isDoesNotExistError, isAlreadyInUseError, 
+    isFullError, isEOFError,
+    isIllegalOperation, isPermissionError, isUserError, 
+    ioeGetErrorString, ioeGetHandle, ioeGetFileName,
+    try, bracket, bracket_,
+
+    -- ...and what the Prelude exports
+    IO, FilePath, IOError, ioError, userError, catch, interact,
+    putChar, putStr, putStrLn, print, getChar, getLine, getContents,
+    readFile, writeFile, appendFile, readIO, readLn
+  ) where
+
+import System.IO
+import System.IO.Error
+
+-- | The 'bracket' function captures a common allocate, compute, deallocate
+-- idiom in which the deallocation step must occur even in the case of an
+-- error during computation. This is similar to try-catch-finally in Java.
+--
+-- This version handles only IO errors, as defined by Haskell 98.
+-- The version of @bracket@ in "Control.Exception" handles all exceptions,
+-- and should be used instead.
+
+bracket        :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
+bracket before after m = do
+        x  <- before
+        rs <- try (m x)
+        after x
+        case rs of
+           Right r -> return r
+           Left  e -> ioError e
+
+-- | A variant of 'bracket' where the middle computation doesn't want @x@.
+--
+-- This version handles only IO errors, as defined by Haskell 98.
+-- The version of @bracket_@ in "Control.Exception" handles all exceptions,
+-- and should be used instead.
+
+bracket_        :: IO a -> (a -> IO b) -> IO c -> IO c
+bracket_ before after m = do
+         x  <- before
+         rs <- try m
+         after x
+         case rs of
+            Right r -> return r
+            Left  e -> ioError e
diff --git a/Int.hs b/Int.hs
new file mode 100644
--- /dev/null
+++ b/Int.hs
@@ -0,0 +1,2 @@
+module Int ( module Data.Int ) where
+import Data.Int
diff --git a/Ix.hs b/Ix.hs
new file mode 100644
--- /dev/null
+++ b/Ix.hs
@@ -0,0 +1,5 @@
+module Ix (
+    Ix(range, index, inRange), rangeSize
+  ) where
+
+import Data.Ix
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+Code derived from the document "Report on the Programming Language
+Haskell 98", is distributed under the following license:
+
+  Copyright (c) 2002 Simon Peyton Jones
+
+  The authors intend this Report to belong to the entire Haskell
+  community, and so we grant permission to copy and distribute it for
+  any purpose, provided that it is reproduced in its entirety,
+  including this Notice.  Modified versions of this Report may also be
+  copied and distributed for any purpose, provided that the modified
+  version is clearly presented as such, and that it does not claim to
+  be a definition of the Haskell 98 Language.
+
+-----------------------------------------------------------------------------
+
+Code derived from the document "The Haskell 98 Foreign Function
+Interface, An Addendum to the Haskell 98 Report" is distributed under
+the following license:
+
+  Copyright (c) 2002 Manuel M. T. Chakravarty
+
+  The authors intend this Report to belong to the entire Haskell
+  community, and so we grant permission to copy and distribute it for
+  any purpose, provided that it is reproduced in its entirety,
+  including this Notice.  Modified versions of this Report may also be
+  copied and distributed for any purpose, provided that the modified
+  version is clearly presented as such, and that it does not claim to
+  be a definition of the Haskell 98 Foreign Function Interface.
diff --git a/List.hs b/List.hs
new file mode 100644
--- /dev/null
+++ b/List.hs
@@ -0,0 +1,29 @@
+module List (
+    elemIndex, elemIndices,
+    find, findIndex, findIndices,
+    nub, nubBy, delete, deleteBy, (\\), deleteFirstsBy,
+    union, unionBy, intersect, intersectBy,
+    intersperse, transpose, partition, group, groupBy,
+    inits, tails, isPrefixOf, isSuffixOf,
+    mapAccumL, mapAccumR,
+    sort, sortBy, insert, insertBy, maximumBy, minimumBy,
+    genericLength, genericTake, genericDrop,
+    genericSplitAt, genericIndex, genericReplicate,
+    zip4, zip5, zip6, zip7,
+    zipWith4, zipWith5, zipWith6, zipWith7,
+    unzip4, unzip5, unzip6, unzip7, unfoldr,
+
+    -- ...and what the Prelude exports
+    -- []((:), []), -- This is built-in syntax
+    map, (++), concat, filter,
+    head, last, tail, init, null, length, (!!),
+    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,
+    iterate, repeat, replicate, cycle,
+    take, drop, splitAt, takeWhile, dropWhile, span, break,
+    lines, words, unlines, unwords, reverse, and, or,
+    any, all, elem, notElem, lookup,
+    sum, product, maximum, minimum, concatMap, 
+    zip, zip3, zipWith, zipWith3, unzip, unzip3
+  ) where
+
+import Data.List hiding (foldl')
diff --git a/Locale.hs b/Locale.hs
new file mode 100644
--- /dev/null
+++ b/Locale.hs
@@ -0,0 +1,10 @@
+module Locale (
+    TimeLocale(..), defaultTimeLocale
+  ) where
+
+import System.Locale ( 
+	-- just the bits that are specified by Haskell 98
+	TimeLocale(TimeLocale,wDays,months,amPm,dateTimeFmt,
+		   dateFmt,timeFmt,time12Fmt),
+        defaultTimeLocale
+    )
diff --git a/MarshalAlloc.hs b/MarshalAlloc.hs
new file mode 100644
--- /dev/null
+++ b/MarshalAlloc.hs
@@ -0,0 +1,2 @@
+module MarshalAlloc (module Foreign.Marshal.Alloc) where
+import Foreign.Marshal.Alloc
diff --git a/MarshalArray.hs b/MarshalArray.hs
new file mode 100644
--- /dev/null
+++ b/MarshalArray.hs
@@ -0,0 +1,2 @@
+module MarshalArray (module Foreign.Marshal.Array) where
+import Foreign.Marshal.Array
diff --git a/MarshalError.hs b/MarshalError.hs
new file mode 100644
--- /dev/null
+++ b/MarshalError.hs
@@ -0,0 +1,17 @@
+module MarshalError (
+  	module Foreign.Marshal.Error,
+	IOErrorType,
+	mkIOError,
+	alreadyExistsErrorType,
+	doesNotExistErrorType,
+	alreadyInUseErrorType,
+	fullErrorType,
+	eofErrorType,
+	illegalOperationErrorType,
+	permissionErrorType,
+	userErrorType,
+	annotateIOError
+  ) where
+
+import System.IO.Error
+import Foreign.Marshal.Error
diff --git a/MarshalUtils.hs b/MarshalUtils.hs
new file mode 100644
--- /dev/null
+++ b/MarshalUtils.hs
@@ -0,0 +1,2 @@
+module MarshalUtils (module Foreign.Marshal.Utils) where
+import Foreign.Marshal.Utils
diff --git a/Maybe.hs b/Maybe.hs
new file mode 100644
--- /dev/null
+++ b/Maybe.hs
@@ -0,0 +1,11 @@
+module Maybe (
+    isJust, isNothing,
+    fromJust, fromMaybe, listToMaybe, maybeToList,
+    catMaybes, mapMaybe,
+
+    -- ...and what the Prelude exports
+    Maybe(Nothing, Just),
+    maybe
+  ) where
+
+import Data.Maybe
diff --git a/Monad.hs b/Monad.hs
new file mode 100644
--- /dev/null
+++ b/Monad.hs
@@ -0,0 +1,14 @@
+module Monad (
+    MonadPlus(mzero, mplus),
+    join, guard, when, unless, ap,
+    msum,
+    filterM, mapAndUnzipM, zipWithM, zipWithM_, foldM, 
+    liftM, liftM2, liftM3, liftM4, liftM5,
+
+    -- ...and what the Prelude exports
+    Monad((>>=), (>>), return, fail),
+    Functor(fmap),
+    mapM, mapM_, sequence, sequence_, (=<<), 
+  ) where
+
+import Control.Monad
diff --git a/Ptr.hs b/Ptr.hs
new file mode 100644
--- /dev/null
+++ b/Ptr.hs
@@ -0,0 +1,2 @@
+module Ptr (module Foreign.Ptr) where
+import Foreign.Ptr
diff --git a/Random.hs b/Random.hs
new file mode 100644
--- /dev/null
+++ b/Random.hs
@@ -0,0 +1,8 @@
+module Random (
+   RandomGen(next, split, genRange),
+   StdGen, mkStdGen,
+   Random( random,   randomR, randoms,  randomRs, randomIO, randomRIO ),
+   getStdRandom, getStdGen, setStdGen, newStdGen
+  ) where
+
+import System.Random
diff --git a/Ratio.hs b/Ratio.hs
new file mode 100644
--- /dev/null
+++ b/Ratio.hs
@@ -0,0 +1,5 @@
+module Ratio (
+    Ratio, Rational, (%), numerator, denominator, approxRational
+  ) where
+
+import Data.Ratio
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMainWithHooks defaultUserHooks
diff --git a/StablePtr.hs b/StablePtr.hs
new file mode 100644
--- /dev/null
+++ b/StablePtr.hs
@@ -0,0 +1,2 @@
+module StablePtr (module Foreign.StablePtr) where
+import Foreign.StablePtr
diff --git a/Storable.hs b/Storable.hs
new file mode 100644
--- /dev/null
+++ b/Storable.hs
@@ -0,0 +1,2 @@
+module Storable (module Foreign.Storable) where
+import Foreign.Storable
diff --git a/System.hs b/System.hs
new file mode 100644
--- /dev/null
+++ b/System.hs
@@ -0,0 +1,8 @@
+module System (
+    ExitCode(ExitSuccess,ExitFailure),
+    getArgs, getProgName, getEnv, system, exitWith, exitFailure
+  ) where
+
+import System.Exit
+import System.Environment
+import System.Cmd
diff --git a/Time.hs b/Time.hs
new file mode 100644
--- /dev/null
+++ b/Time.hs
@@ -0,0 +1,15 @@
+module Time (
+    ClockTime, 
+    Month(January,February,March,April,May,June,
+          July,August,September,October,November,December),
+    Day(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday),
+    CalendarTime(CalendarTime, ctYear, ctMonth, ctDay, ctHour, ctMin,
+    		 ctSec, ctPicosec, ctWDay, ctYDay, ctTZName, ctTZ, ctIsDST),
+    TimeDiff(TimeDiff, tdYear, tdMonth, tdDay, tdHour,
+ 	     tdMin, tdSec, tdPicosec),
+    getClockTime, addToClockTime, diffClockTimes,
+    toCalendarTime, toUTCTime, toClockTime,
+    calendarTimeToString, formatCalendarTime 
+  ) where
+
+import System.Time
diff --git a/Word.hs b/Word.hs
new file mode 100644
--- /dev/null
+++ b/Word.hs
@@ -0,0 +1,2 @@
+module Word ( module Data.Word ) where
+import Data.Word
diff --git a/haskell98.cabal b/haskell98.cabal
new file mode 100644
--- /dev/null
+++ b/haskell98.cabal
@@ -0,0 +1,22 @@
+name:		haskell98
+version:	1.0
+license:	BSD3
+license-file:	LICENSE
+maintainer:	libraries@haskell.org
+synopsis:	Compatibility with Haskell 98
+description:
+	This package provides compatibility with the modules of Haskell
+	98 and the FFI addendum, by means of wrappers around modules from
+	the base package (which in many cases have additional features).
+	However Prelude, Numeric and Foreign are provided directly by
+	the base package.
+homepage:	http://www.haskell.org/definition/
+build-depends:	base
+exposed-modules:
+	-- Haskell 98 (Prelude and Numeric are in the base package)
+	Array, CPUTime, Char, Complex, Directory, IO, Ix, List, Locale,
+	Maybe, Monad, Random, Ratio, System, Time,
+	-- FFI addendum (Foreign is in the base package)
+	Bits, CError, CForeign, CString, CTypes, ForeignPtr, Int,
+	MarshalAlloc, MarshalArray, MarshalError, MarshalUtils, Ptr,
+	StablePtr, Storable, Word
