diff --git a/CHANGES b/CHANGES
new file mode 100644
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,7 @@
+Version 1.2.1 - released 2009-01-19; changes from 1.2.0
+
+  * fix bad mix of allocators, the accidental introduction of the
+    combined use of the CRT one (malloc()) and the COM task allocaotr
+    led to spurious MM crashes.
+  * drop 'haskell98' dependencies
+
diff --git a/System/Win32/Com.hs b/System/Win32/Com.hs
--- a/System/Win32/Com.hs
+++ b/System/Win32/Com.hs
@@ -224,7 +224,7 @@
 import Foreign.ForeignPtr
 import Foreign.Storable
 import Data.Bits
-import IO         ( bracket ) 
+import Control.Exception ( bracket ) 
 
 infixl 1 #
 infixl 0 ##
diff --git a/System/Win32/Com/Automation.hs b/System/Win32/Com/Automation.hs
--- a/System/Win32/Com/Automation.hs
+++ b/System/Win32/Com/Automation.hs
@@ -138,9 +138,8 @@
     ) where
 
 import System.Win32.Com.HDirect.HDirect as HDirect
-import IO          ( ioeGetErrorString )
-import Data.Char   ( chr, ord )
-import System.Time ( ClockTime(..) )
+import System.IO.Error ( ioeGetErrorString )
+import System.Time     ( ClockTime(..) )
 
 import Data.Word ( Word8, Word16, Word32 )
 import Data.Int  ( Int32, Int16, Int8, Int64 )
@@ -729,10 +728,10 @@
 defaultChar            = '\0'
 
 inChar :: ArgIn Char
-inChar i               = writeVarByte (fromIntegral (ord i))
+inChar i               = writeVarByte (fromIntegral (fromEnum i))
 
 resChar :: ArgRes Char
-resChar  p             = readVarByte p >>= \ x -> return (chr (fromIntegral x))
+resChar  p             = readVarByte p >>= \ x -> return (toEnum (fromIntegral x))
 
 inoutChar i            = (inChar i,resChar)
 outChar                = inoutChar defaultChar
diff --git a/System/Win32/Com/Automation/Base.hs b/System/Win32/Com/Automation/Base.hs
--- a/System/Win32/Com/Automation/Base.hs
+++ b/System/Win32/Com/Automation/Base.hs
@@ -21,7 +21,7 @@
 import Data.Int  (Int32, Int16)
 import Data.Word (Word8, Word32)
 import Foreign.ForeignPtr ( ForeignPtr, withForeignPtr )
-import Foreign.Ptr
+import Foreign.Ptr ( castPtr ) 
 
 data VARIANT_ = VARIANT_
 type VARIANT = Ptr VARIANT_
diff --git a/System/Win32/Com/Base.hs b/System/Win32/Com/Base.hs
--- a/System/Win32/Com/Base.hs
+++ b/System/Win32/Com/Base.hs
@@ -17,7 +17,7 @@
 import System.IO.Unsafe ( unsafePerformIO )
 import System.Win32.Com.HDirect.WideString ( WideString, marshallWideString, freeWideString,
 		    readWideString, writeWideString )
-import IO         ( hPutStrLn, stderr )
+import System.IO        ( hPutStrLn, stderr )
 
 import Control.Exception
 import Data.Typeable
diff --git a/System/Win32/Com/Exception.hs b/System/Win32/Com/Exception.hs
--- a/System/Win32/Com/Exception.hs
+++ b/System/Win32/Com/Exception.hs
@@ -22,7 +22,7 @@
 import Data.Dynamic
 import Data.Maybe ( isJust, fromMaybe )
 import Numeric ( showHex )
-import IO
+import System.IO.Error ( ioeGetErrorString )
 
 #if BASE == 3
 import GHC.IOBase
diff --git a/System/Win32/Com/HDirect/HDirect.hs b/System/Win32/Com/HDirect/HDirect.hs
--- a/System/Win32/Com/HDirect/HDirect.hs
+++ b/System/Win32/Com/HDirect/HDirect.hs
@@ -54,7 +54,8 @@
 import Foreign.Ptr
 import Foreign.C.Types ( CChar )
 import Foreign.C.String
-import Foreign.Marshal.Alloc (mallocBytes, free)
+import Foreign.Marshal.Alloc (mallocBytes)
+import qualified Foreign.Marshal.Alloc as Alloc (free)
 
 import Data.Bits
 #if __GLASGOW_HASKELL__ >= 505
@@ -407,9 +408,18 @@
 allocWords :: Int -> IO (Ptr a)
 allocWords len = alloc (4 * fromIntegral len)
 
+alloc_malloc :: Word32 -> IO (Ptr a)
+alloc_malloc s = mallocBytes (fromIntegral s)
 
+free_malloc = Alloc.free
+
+free = freeMemory
+
+-- Note: we want/have to use the COM task allocator here so as to
+-- remain consistent (=> finalization happens by calling one allocator,
+-- it being the COM one.)
 alloc :: Word32 -> IO (Ptr a)
-alloc s = mallocBytes (fromIntegral s)
+alloc s = allocMemory s
 
 doThenFree ::(Ptr a -> IO ()) -> (Ptr b -> IO c) -> Ptr d -> IO c
 doThenFree f act ptr = do
diff --git a/System/Win32/Com/Server.hs b/System/Win32/Com/Server.hs
--- a/System/Win32/Com/Server.hs
+++ b/System/Win32/Com/Server.hs
@@ -100,8 +100,8 @@
 import System.Win32.Com.Exception
 import System.Win32.Com.HDirect.WideString
 
-import Monad
-import List
+import Control.Monad
+import Data.List
 
 --Basic types - we're essentially untyped here; safety is provided
 --by the abstraction levels above us.
diff --git a/cbits/PointerSrc.c b/cbits/PointerSrc.c
--- a/cbits/PointerSrc.c
+++ b/cbits/PointerSrc.c
@@ -4,6 +4,7 @@
 
 #if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(__CYGWIN__)
 #define __BASTARDIZED_WIN32__ 1
+#define COM 1
 #endif
 
 /*-----------------------------------------------------------
@@ -120,7 +121,7 @@
    if (!p) printf( "freeing null pointer\n" );
  #endif
    if (!p) return;
- #ifdef DEBUG
+ #if defined(DEBUG)
    if (p) nallocs--;
    printf( "free: %p\n", p);
  #endif
diff --git a/cbits/WideStringSrc.c b/cbits/WideStringSrc.c
--- a/cbits/WideStringSrc.c
+++ b/cbits/WideStringSrc.c
@@ -6,6 +6,9 @@
 #define DLLEXPORT(res)  extern res
 #endif
 
+#ifndef COM
+#define COM
+#endif
 
 #ifdef COM
 #define COBJMACROS
diff --git a/com.cabal b/com.cabal
--- a/com.cabal
+++ b/com.cabal
@@ -1,5 +1,5 @@
 Name: com
-version: 1.2.0
+version: 1.2.1
 Synopsis: Haskell COM support library
 Description: 
     COM + Automation libraries for Haskell.
@@ -19,14 +19,15 @@
           include/safeArrayPrim.h
           include/SafeArray.h
           include/StdTypes.h
+          CHANGES
 
 flag old-base
   description: Old, monolithic base
   default: False
 
 library {
-Build-depends: haskell98, old-time
-Exposed-Modules: System.Win32.Com,
+if os(windows)
+ Exposed-Modules: System.Win32.Com,
                  System.Win32.Com.Base,
                  System.Win32.Com.Automation,
                  System.Win32.Com.Automation.Base,
@@ -48,9 +49,9 @@
                  System.Win32.Com.HDirect.PointerPrim,
                  System.Win32.Com.HDirect.WideString
                  
-Include-dirs: . cbits include
+ Include-dirs: . cbits include
 
-Includes: include/PointerSrc.h
+ Includes: include/PointerSrc.h
           include/WideStringSrc.h
           include/comPrim.h
           include/autoPrim.h
@@ -59,24 +60,28 @@
           include/SafeArray.h
           include/StdTypes.h
 
-C-Sources: cbits/PointerSrc.c
+ C-Sources: cbits/PointerSrc.c
            cbits/WideStringSrc.c
            cbits/ComPrimSrc.c
            cbits/AutoPrimSrc.c
            cbits/Registry.c
            cbits/SafeArrayPrim.c
 
-Extra-libraries: kernel32, user32, ole32, oleaut32, advapi32
-GHC-Options: -fglasgow-exts -fvia-C 
+ Extra-libraries: kernel32, user32, ole32, oleaut32, advapi32
+ GHC-Options: -fglasgow-exts -fvia-C 
 -- I can't seem to feed this into the 'ld' invocation that creates the
 -- relocatable object file.
-Ld-options: --enable-stdcall-fixup --disable-stdcall-fixup
-Extensions: CPP
+ Ld-options: --enable-stdcall-fixup --disable-stdcall-fixup
+ Extensions: CPP
 
-if flag(old-base)
+ Build-depends: old-time
+ if flag(old-base)
   Build-Depends: base < 4
   CPP-Options: -DBASE=3
-else
+ else
   Build-Depends: base >= 4
   CPP-Options: -DBASE=4
+else
+ Build-Depends: base
+
 }
diff --git a/include/PointerSrc.h b/include/PointerSrc.h
--- a/include/PointerSrc.h
+++ b/include/PointerSrc.h
@@ -9,6 +9,10 @@
 #define SUPPORT_COM 1
 #endif
 
+#ifndef COM
+#define COM 1
+#endif
+
 extern void   primNoFree(void* p);
 extern void   primPointerCheck();
 extern void   primFinalise(void* f, void* a);
