diff --git a/Data/Array/Accelerate/CUDA/Array/Prim.hs b/Data/Array/Accelerate/CUDA/Array/Prim.hs
--- a/Data/Array/Accelerate/CUDA/Array/Prim.hs
+++ b/Data/Array/Accelerate/CUDA/Array/Prim.hs
@@ -87,11 +87,11 @@
 
 primArrayEltAs(CShort,  Int16)
 primArrayEltAs(CInt,    Int32)
-primArrayEltAs(CLong,   Int64)
+primArrayEltAs(CLong,   HTYPE_LONG)
 primArrayEltAs(CLLong,  Int64)
 primArrayEltAs(CUShort, Word16)
 primArrayEltAs(CUInt,   Word32)
-primArrayEltAs(CULong,  Word64)
+primArrayEltAs(CULong,  HTYPE_UNSIGNED_LONG)
 primArrayEltAs(CULLong, Word64)
 
 primArrayElt(Float)
@@ -134,8 +134,6 @@
 instance TextureData CUShort where format _ = (CUDA.Word16, 1)
 instance TextureData CInt    where format _ = (CUDA.Int32,  1)
 instance TextureData CUInt   where format _ = (CUDA.Word32, 1)
-instance TextureData CLong   where format _ = (CUDA.Int32,  2)
-instance TextureData CULong  where format _ = (CUDA.Word32, 2)
 instance TextureData CLLong  where format _ = (CUDA.Int32,  2)
 instance TextureData CULLong where format _ = (CUDA.Word32, 2)
 instance TextureData CFloat  where format _ = (CUDA.Float,  1)
@@ -143,32 +141,11 @@
 instance TextureData CChar   where format _ = (CUDA.Int8,   1)
 instance TextureData CSChar  where format _ = (CUDA.Int8,   1)
 instance TextureData CUChar  where format _ = (CUDA.Word8,  1)
-#if   SIZEOF_HSINT == 4
-instance TextureData Int     where format _ = (CUDA.Int32,  1)
-instance TextureData Word    where format _ = (CUDA.Word32, 1)
-#elif SIZEOF_HSINT == 8
-instance TextureData Int     where format _ = (CUDA.Int32,  2)
-instance TextureData Word    where format _ = (CUDA.Word32, 2)
-#else
-instance TextureData Int     where
-  format _ =
-    case sizeOf (undefined::Int) of
-      4 -> (CUDA.Int32, 1)
-      8 -> (CUDA.Int32, 2)
-instance TextureData Word    where
-  format _ =
-    case sizeOf (undefined::Word) of
-      4 -> (CUDA.Word32, 1)
-      8 -> (CUDA.Word32, 2)
-#endif
-#if SIZEOF_HSCHAR == 4
 instance TextureData Char    where format _ = (CUDA.Word32, 1)
-#else
-instance TextureData Char    where
-  format _ =
-    case sizeOf (undefined::Char) of
-         4 -> (CUDA.Word32, 1)
-#endif
+instance TextureData Int     where format _ = (CUDA.Int32,  SIZEOF_HTYPE_INT           `div` 4)
+instance TextureData Word    where format _ = (CUDA.Word32, SIZEOF_HTYPE_WORD          `div` 4)
+instance TextureData CLong   where format _ = (CUDA.Int32,  SIZEOF_HTYPE_LONG          `div` 4)
+instance TextureData CULong  where format _ = (CUDA.Word32, SIZEOF_HTYPE_UNSIGNED_LONG `div` 4)
 
 
 -- Primitive array operations
diff --git a/Data/Array/Accelerate/CUDA/CodeGen/Type.hs b/Data/Array/Accelerate/CUDA/CodeGen/Type.hs
--- a/Data/Array/Accelerate/CUDA/CodeGen/Type.hs
+++ b/Data/Array/Accelerate/CUDA/CodeGen/Type.hs
@@ -36,10 +36,6 @@
 import Language.C.Quote.CUDA
 import qualified Language.C                             as C
 
-#if !defined(SIZEOF_HSINT) || !defined(SIZEOF_HSCHAR)
-import Foreign.Storable
-#endif
-
 #include "accelerate.h"
 
 
@@ -109,26 +105,9 @@
 codegenIntegralType (TypeCULong  _) = [cty|unsigned long int|]
 codegenIntegralType (TypeCLLong  _) = [cty|long long int|]
 codegenIntegralType (TypeCULLong _) = [cty|unsigned long long int|]
-#if   SIZEOF_HSINT == 4
-codegenIntegralType (TypeInt     _) = typename "Int32"
-#elif SIZEOF_HSINT == 8
-codegenIntegralType (TypeInt     _) = typename "Int64"
-#else
-codegenIntegralType (TypeInt     _) = typename
-  $ case sizeOf (undefined :: Int) of
-      4 -> "Int32"
-      8 -> "Int64"
-#endif
-#if   SIZEOF_HSINT == 4
-codegenIntegralType (TypeWord    _) = typename "Word32"
-#elif SIZEOF_HSINT == 8
-codegenIntegralType (TypeWord    _) = typename "Word64"
-#else
-codegenIntegralType (TypeWord    _) = typename
-  $ case sizeOf (undefined :: Int) of
-      4 -> "Word32"
-      8 -> "Word64"
-#endif
+-- XXX: GHC's inbuilt CPP system can't handle stringification
+codegenIntegralType (TypeInt     _) = typename $ "Int"  ++ show (SIZEOF_HTYPE_INT * 8 :: Int)
+codegenIntegralType (TypeWord    _) = typename $ "Word" ++ show (SIZEOF_HTYPE_INT * 8 :: Int)
 
 codegenFloatingType :: FloatingType a -> C.Type
 codegenFloatingType (TypeFloat   _) = [cty|float|]
@@ -138,13 +117,7 @@
 
 codegenNonNumType :: NonNumType a -> C.Type
 codegenNonNumType (TypeBool   _) = typename "Word8"
-#if   SIZEOF_HSCHAR == 4
 codegenNonNumType (TypeChar   _) = typename "Word32"
-#else
-codegenNonNumType (TypeChar   _) = typename
-  $ case sizeOf (undefined :: Char) of
-      4 -> "Word32"
-#endif
 codegenNonNumType (TypeCChar  _) = [cty|char|]
 codegenNonNumType (TypeCSChar _) = [cty|signed char|]
 codegenNonNumType (TypeCUChar _) = [cty|unsigned char|]
@@ -189,27 +162,9 @@
 codegenIntegralTex (TypeCULong  _) = typename "TexCULong"
 codegenIntegralTex (TypeCLLong  _) = typename "TexCLLong"
 codegenIntegralTex (TypeCULLong _) = typename "TexCULLong"
-#if   SIZEOF_HSINT == 4
-codegenIntegralTex (TypeInt     _) = typename "TexInt32"
-#elif SIZEOF_HSINT == 8
-codegenIntegralTex (TypeInt     _) = typename "TexInt64"
-#else
-codegenIntegralTex (TypeInt     _) = typename
-  $ case sizeOf (undefined :: Int) of
-      4 -> "TexInt32"
-      8 -> "TexInt64"
-#endif
-#if   SIZEOF_HSINT == 4
-codegenIntegralTex (TypeWord    _) = typename "TexWord32"
-#elif SIZEOF_HSINT == 8
-codegenIntegralTex (TypeWord    _) = typename "TexWord64"
-#else
-codegenIntegralTex (TypeWord    _) = typename
-  $ case sizeOf (undefined :: Word) of
-      4 -> "TexWord32"
-      8 -> "TexWord64"
-#endif
-
+-- XXX: GHC's inbuilt CPP system can't handle stringification
+codegenIntegralTex (TypeInt     _) = typename $ "TexInt"  ++ show (SIZEOF_HTYPE_INT * 8 :: Int)
+codegenIntegralTex (TypeWord    _) = typename $ "TexWord" ++ show (SIZEOF_HTYPE_INT * 8 :: Int)
 
 codegenFloatingTex :: FloatingType a -> C.Type
 codegenFloatingTex (TypeFloat   _) = typename "TexFloat"
@@ -220,13 +175,7 @@
 
 codegenNonNumTex :: NonNumType a -> C.Type
 codegenNonNumTex (TypeBool   _) = typename "TexWord8"
-#if   SIZEOF_HSCHAR == 4
 codegenNonNumTex (TypeChar   _) = typename "TexWord32"
-#else
-codegenNonNumTex (TypeChar   _) = typename
-  $ case sizeOf (undefined :: Char) of
-      4 -> "TexWord32"
-#endif
 codegenNonNumTex (TypeCChar  _) = typename "TexCChar"
 codegenNonNumTex (TypeCSChar _) = typename "TexCSChar"
 codegenNonNumTex (TypeCUChar _) = typename "TexCUChar"
diff --git a/Data/Array/Accelerate/CUDA/Compile.hs b/Data/Array/Accelerate/CUDA/Compile.hs
--- a/Data/Array/Accelerate/CUDA/Compile.hs
+++ b/Data/Array/Accelerate/CUDA/Compile.hs
@@ -76,10 +76,6 @@
 import System.Win32.Process
 #endif
 
-#ifndef SIZEOF_HSINT
-import Foreign.Storable
-#endif
-
 import Paths_accelerate_cuda                                    ( getDataDir )
 
 
@@ -456,15 +452,9 @@
     , machine
     , cufile ]
   where
-#if SIZEOF_HSINT == 4
-    machine     = "-m32"
-#elif SIZEOF_HSINT == 8
-    machine     = "-m64"
-#else
-    machine     = case sizeOf (undefined :: Int) of
-                    4 -> "-m32"
-                    8 -> "-m64"
-#endif
+    machine     = case (SIZEOF_HTYPE_INT :: Int) of
+                    4   -> "-m32"
+                    8   -> "-m64"
 
 
 -- Open a unique file in the temporary directory used for compilation
diff --git a/accelerate-cuda.cabal b/accelerate-cuda.cabal
--- a/accelerate-cuda.cabal
+++ b/accelerate-cuda.cabal
@@ -1,5 +1,5 @@
 Name:                   accelerate-cuda
-Version:                0.13.0.0
+Version:                0.13.0.1
 Cabal-version:          >= 1.6
 Tested-with:            GHC >= 7.4
 Build-type:             Custom
@@ -54,6 +54,7 @@
 
 Extra-tmp-files:        config.status
                         config.log
+                        autom4te.cache
                         accelerate-cuda.buildinfo               -- generated by configure
                         cubits/accelerate_cuda_shape.h          -- generated by configure
 
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -589,7 +589,6 @@
 LIBOBJS
 cpp_flags
 ghc_flags
-type_hs_char
 type_hs_int
 OBJEXT
 EXEEXT
@@ -2321,7 +2320,7 @@
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of Int" >&5
 $as_echo_n "checking size of Int... " >&6; }
 
-    sizeof_hs_Int=`$GHC -w -ignore-dot-ghci -e "Foreign.sizeOf (undefined::Int)"`
+    sizeof_hs_Int=`$GHC -w -ignore-dot-ghci -e "import Foreign" -e "import Foreign.C" -e "sizeOf (undefined::Int)"`
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_hs_Int" >&5
 $as_echo "$sizeof_hs_Int" >&6; }
 
@@ -2330,30 +2329,87 @@
         8) type_hs_int=Int64 ;;
     esac
 
-    def="-DSIZEOF_HS$(echo Int | tr [:lower:] [:upper:])=$sizeof_hs_Int"
+    # The type name
+    def="-DHTYPE_INT=$type_hs_int"
     cpp_flags="$cpp_flags $def"
     ghc_flags="$ghc_flags -optP$def"
 
+    # And size
+    def="-DSIZEOF_HTYPE_INT=$sizeof_hs_Int"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of Char" >&5
-$as_echo_n "checking size of Char... " >&6; }
 
-    sizeof_hs_Char=`$GHC -w -ignore-dot-ghci -e "Foreign.sizeOf (undefined::Char)"`
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_hs_Char" >&5
-$as_echo "$sizeof_hs_Char" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of Word" >&5
+$as_echo_n "checking size of Word... " >&6; }
 
-    case $sizeof_hs_Char in
-        4) type_hs_char=Word32 ;;
-        8) type_hs_char=Word64 ;;
+    sizeof_hs_Word=`$GHC -w -ignore-dot-ghci -e "import Foreign" -e "import Foreign.C" -e "sizeOf (undefined::Word)"`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_hs_Word" >&5
+$as_echo "$sizeof_hs_Word" >&6; }
+
+    case $sizeof_hs_Word in
+        4) type_hs_word=Word32 ;;
+        8) type_hs_word=Word64 ;;
     esac
 
-    def="-DSIZEOF_HS$(echo Char | tr [:lower:] [:upper:])=$sizeof_hs_Char"
+    # The type name
+    def="-DHTYPE_WORD=$type_hs_word"
     cpp_flags="$cpp_flags $def"
     ghc_flags="$ghc_flags -optP$def"
 
+    # And size
+    def="-DSIZEOF_HTYPE_WORD=$sizeof_hs_Word"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
 
 
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of CLong" >&5
+$as_echo_n "checking size of CLong... " >&6; }
 
+    sizeof_hs_CLong=`$GHC -w -ignore-dot-ghci -e "import Foreign" -e "import Foreign.C" -e "sizeOf (undefined::CLong)"`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_hs_CLong" >&5
+$as_echo "$sizeof_hs_CLong" >&6; }
+
+    case $sizeof_hs_CLong in
+        4) type_hs_long=Int32 ;;
+        8) type_hs_long=Int64 ;;
+    esac
+
+    # The type name
+    def="-DHTYPE_LONG=$type_hs_long"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
+
+    # And size
+    def="-DSIZEOF_HTYPE_LONG=$sizeof_hs_CLong"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of CULong" >&5
+$as_echo_n "checking size of CULong... " >&6; }
+
+    sizeof_hs_CULong=`$GHC -w -ignore-dot-ghci -e "import Foreign" -e "import Foreign.C" -e "sizeOf (undefined::CULong)"`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_hs_CULong" >&5
+$as_echo "$sizeof_hs_CULong" >&6; }
+
+    case $sizeof_hs_CULong in
+        4) type_hs_unsigned_long=Word32 ;;
+        8) type_hs_unsigned_long=Word64 ;;
+    esac
+
+    # The type name
+    def="-DHTYPE_UNSIGNED_LONG=$type_hs_unsigned_long"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
+
+    # And size
+    def="-DSIZEOF_HTYPE_UNSIGNED_LONG=$sizeof_hs_CULong"
+    cpp_flags="$cpp_flags $def"
+    ghc_flags="$ghc_flags -optP$def"
+
+
+         # array index type in accelerate_cuda_shape.h.in
 
 
 cat >confcache <<\_ACEOF
diff --git a/cubits/accelerate_cuda_shape.h b/cubits/accelerate_cuda_shape.h
--- a/cubits/accelerate_cuda_shape.h
+++ b/cubits/accelerate_cuda_shape.h
@@ -23,7 +23,7 @@
  * future hardware gains better 64-bit support and/or we need to access very
  * large arrays.
  *
- * typedef Int64                             Ix;
+ * typedef Int32                             Ix;
  */
 typedef Int32                                     Ix;
 typedef void*                                     DIM0;
