diff --git a/configure.in b/configure.in
index 77cd602e676bf547fb739cccc2db5639b00aae42..08e2f188806e02f919f2522759324d19f00fecc2 100644
--- a/configure.in
+++ b/configure.in
@@ -535,27 +535,43 @@ FPTOOLS_ALTZONE
 dnl ** does struct stat contain st_blksize?
 AC_STRUCT_ST_BLKSIZE
 
+dnl ** do we have long longs?
+FPTOOLS_C_LONG_LONG
+
 dnl ** what are the sizes of various types
 dnl    (these must come before GHC_CHECK_ALIGNMENT)
-AC_CHECK_SIZEOF(char,        1)
-AC_CHECK_SIZEOF(int,         4)
-AC_CHECK_SIZEOF(unsigned int,4)
-AC_CHECK_SIZEOF(float,       4)
-AC_CHECK_SIZEOF(double,      8)
-AC_CHECK_SIZEOF(long,        4)
-AC_CHECK_SIZEOF(void *,      4)
+AC_CHECK_SIZEOF(char,               1)
+AC_CHECK_SIZEOF(unsigned char,      1)
+AC_CHECK_SIZEOF(short,              2)
+AC_CHECK_SIZEOF(unsigned short,     2)
+AC_CHECK_SIZEOF(int,                4)
+AC_CHECK_SIZEOF(unsigned int,       4)
+AC_CHECK_SIZEOF(long,               4)
+AC_CHECK_SIZEOF(unsigned long,      4)
+if test "$fptools_cv_have_long_long" = yes; then
+AC_CHECK_SIZEOF(long long,          8)
+AC_CHECK_SIZEOF(unsigned long long, 8)
+fi
+AC_CHECK_SIZEOF(float,              4)
+AC_CHECK_SIZEOF(double,             8)
+AC_CHECK_SIZEOF(void *,             4)
 
 dnl ** what are alignment constraints on various types
 FPTOOLS_CHECK_ALIGNMENT(char)
+FPTOOLS_CHECK_ALIGNMENT(unsigned char)
+FPTOOLS_CHECK_ALIGNMENT(short)
+FPTOOLS_CHECK_ALIGNMENT(unsigned short)
 FPTOOLS_CHECK_ALIGNMENT(int)
-FPTOOLS_CHECK_ALIGNMENT(void *)
-FPTOOLS_CHECK_ALIGNMENT(unsigned int) dnl redundant but harmless
+FPTOOLS_CHECK_ALIGNMENT(unsigned int)
 FPTOOLS_CHECK_ALIGNMENT(long)
+FPTOOLS_CHECK_ALIGNMENT(unsigned long)
+if test "$fptools_cv_have_long_long" = yes; then
+FPTOOLS_CHECK_ALIGNMENT(long long)
+FPTOOLS_CHECK_ALIGNMENT(unsigned long long)
+fi
 FPTOOLS_CHECK_ALIGNMENT(float)
 FPTOOLS_CHECK_ALIGNMENT(double)
-
-dnl ** do we have long longs?
-FPTOOLS_C_LONG_LONG
+FPTOOLS_CHECK_ALIGNMENT(void *)
 
 dnl ** can we open files in binary mode?
 FPTOOLS_O_BINARY
diff --git a/mk/config.h.in b/mk/config.h.in
index 86c0613ac7e2b689fbee6a9015f2b937dc80ffba..7ff942b28f6886b447c3694b121e4077d5322663 100644
--- a/mk/config.h.in
+++ b/mk/config.h.in
@@ -66,14 +66,35 @@
    byte first (like Motorola and SPARC, unlike Intel and VAX).  */
 #undef WORDS_BIGENDIAN
 
-/* Define to alignment constraint on characters */
+/* Define to alignment constraint on chars */
 #undef ALIGNMENT_CHAR
 
+/* Define to alignment constraint on unsigned chars */
+#undef ALIGNMENT_UNSIGNED_CHAR
+
+/* Define to alignment constraint on shorts */
+#undef ALIGNMENT_SHORT
+
+/* Define to alignment constraint on unsigned shorts */
+#undef ALIGNMENT_UNSIGNED_SHORT
+
 /* Define to alignment constraint on ints */
 #undef ALIGNMENT_INT
 
-/* Define to alignment constraint on void pointers */
-#undef ALIGNMENT_VOID_P
+/* Define to alignment constraint on unsigned ints */
+#undef ALIGNMENT_UNSIGNED_INT
+
+/* Define to alignment constraint on longs */
+#undef ALIGNMENT_LONG
+
+/* Define to alignment constraint on unsigned longs */
+#undef ALIGNMENT_UNSIGNED_LONG
+
+/* Define to alignment constraint on long longs */
+#undef ALIGNMENT_LONG_LONG
+
+/* Define to alignment constraint on unsigned long longs */
+#undef ALIGNMENT_UNSIGNED_LONG_LONG
 
 /* Define to alignment constraint on doubles */
 #undef ALIGNMENT_DOUBLE
@@ -81,11 +102,8 @@
 /* Define to alignment constraint on floats */
 #undef ALIGNMENT_FLOAT
 
-/* Define to alignment constraint on doubles */
-#undef ALIGNMENT_LONG
-
-/* Define to alignment constraint on unsigned int */
-#undef ALIGNMENT_UNSIGNED_INT
+/* Define to alignment constraint on void pointers */
+#undef ALIGNMENT_VOID_P
 
 /* Define if code lives before data in memory */
 #undef CODE_BEFORE_DATA
@@ -146,21 +164,39 @@
 /* The number of bytes in a char.  */
 #undef SIZEOF_CHAR
 
+/* The number of bytes in an unsigned char.  */
+#undef SIZEOF_UNSIGNED_CHAR
+
+/* The number of bytes in a short.  */
+#undef SIZEOF_SHORT
+
+/* The number of bytes in an unsigned short.  */
+#undef SIZEOF_UNSIGNED_SHORT
+
 /* The number of bytes in a int.  */
 #undef SIZEOF_INT
 
+/* The number of bytes in an unsigned int.  */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The number of bytes in a long.  */
+#undef SIZEOF_LONG
+
+/* The number of bytes in an unsigned long.  */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The number of bytes in a long long.  */
+#undef SIZEOF_LONG_LONG
+
+/* The number of bytes in an unsigned long long.  */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
 /* The number of bytes in a double.  */
 #undef SIZEOF_DOUBLE
 
 /* The number of bytes in a float.  */
 #undef SIZEOF_FLOAT
 
-/* The number of bytes in a long.  */
-#undef SIZEOF_LONG
-
-/* The number of bytes in a unsigned int.  */
-#undef SIZEOF_UNSIGNED_INT
-
 /* The number of bytes in a void *.  */
 #undef SIZEOF_VOID_P