diff --git a/CMakeLists.txt b/CMakeLists.txt
index cf56616c8c5ad1c7c2d40d86e8c0f009471deaa4..eca7e3198cb8014239cdba6e483cf9dc8e169015 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -254,56 +254,20 @@ IF(UNIX)
 ENDIF(UNIX)
 
 IF(KWSYS_USE_FundamentalType)
-  # Load fundamental type information generated by the below try-run.
-  IF(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-    # The file already exists.  Load it now.
-    INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-  ELSE(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-    # The file does not exist.  Try to generate it.  All the type
-    # information can be detected by a single try-run because the
-    # available types can be determined at compile time.  This
-    # significantly reduces the number of try-compiles and try-runs needed
-    # to collect this information.
-    MESSAGE(STATUS "Checking C++ fundamental types")
-
-    # Pass the output directory in KWSYS_CXX_TYPE_INFO_DIR as a cache
-    # entry to work-around some CMake parsing problems when there are
-    # spaces in the path (for CMake 2.2.1 and lower).  Do not quote
-    # the definition for VS 7 or 8 to work-around a CMake 2.2.1 and
-    # lower generator bug.
-    SET(DOLLAR "$")
-    IF(CMAKE_GENERATOR MATCHES "Visual Studio [78]")
-      SET(QUOTE "")
-    ELSE(CMAKE_GENERATOR MATCHES "Visual Studio [78]")
-      SET(QUOTE "\"")
-    ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio [78]")
-    TRY_RUN(KWSYS_CXX_TYPE_INFO KWSYS_CXX_TYPE_INFO_COMPILED
-      ${CMAKE_CURRENT_BINARY_DIR}
-      ${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformCxxTests.cxx
-      CMAKE_FLAGS
-      "-DKWSYS_CXX_TYPE_INFO_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}"
-      COMPILE_DEFINITIONS
-      -DTEST_KWSYS_CXX_TYPE_INFO
-      "-DKWSYS_CXX_TYPE_INFO_FILE=${QUOTE}${DOLLAR}{KWSYS_CXX_TYPE_INFO_DIR}/FundamentalTypeInfo.cmake${QUOTE}"
-      OUTPUT_VARIABLE OUTPUT
-      )
-
-    # Check if the file now exists.
-    IF(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-      # The file exists.  Report success and load it.
-      MESSAGE(STATUS "Checking C++ fundamental types -- success")
-      FILE(APPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeOutput.log
-        "Checking C++ fundamental types compiled with the following output:\n${OUTPUT}\n\n")
-      INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-    ELSE(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-      # The file does not exist.  Report failure.
-      MESSAGE(STATUS "Checking C++ fundamental types -- failure")
-      FILE(APPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeError.log
-        "Checking C++ fundamental types failed to compile with the following output:\n${OUTPUT}\n\n")
-      MESSAGE(FATAL_ERROR "Checking C++ fundamental type information failed.  "
-        "Check \"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeError.log\" for more information.")
-    ENDIF(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
-  ENDIF(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/FundamentalTypeInfo.cmake)
+  # Determine type sizes.
+  INCLUDE(CheckTypeSize)
+  CHECK_TYPE_SIZE("char"      KWSYS_SIZEOF_CHAR)
+  CHECK_TYPE_SIZE("short"     KWSYS_SIZEOF_SHORT)
+  CHECK_TYPE_SIZE("int"       KWSYS_SIZEOF_INT)
+  CHECK_TYPE_SIZE("long"      KWSYS_SIZEOF_LONG)
+  CHECK_TYPE_SIZE("long long" KWSYS_SIZEOF_LONG_LONG)
+  CHECK_TYPE_SIZE("__int64"   KWSYS_SIZEOF___INT64)
+  IF(NOT KWSYS_SIZEOF_LONG_LONG)
+    SET(KWSYS_SIZEOF_LONG_LONG 0)
+  ENDIF(NOT KWSYS_SIZEOF_LONG_LONG)
+  IF(NOT KWSYS_SIZEOF___INT64)
+    SET(KWSYS_SIZEOF___INT64 0)
+  ENDIF(NOT KWSYS_SIZEOF___INT64)
 
   # Check uniqueness of types.
   IF(KWSYS_SIZEOF___INT64)
@@ -339,6 +303,26 @@ IF(KWSYS_USE_FundamentalType)
   ELSE(KWSYS_USE___INT64)
     SET(KWSYS_CAN_CONVERT_UI64_TO_DOUBLE 1)
   ENDIF(KWSYS_USE___INT64)
+
+  # Check signedness of "char" type.
+  IF("KWSYS_CHAR_IS_SIGNED" MATCHES "^KWSYS_CHAR_IS_SIGNED$")
+    MESSAGE(STATUS "Checking signedness of char")
+    TRY_RUN(KWSYS_CHAR_IS_SIGNED KWSYS_CHAR_IS_SIGNED_COMPILED
+      ${CMAKE_CURRENT_BINARY_DIR}
+      ${CMAKE_CURRENT_SOURCE_DIR}/kwsysPlatformCxxTests.cxx
+      COMPILE_DEFINITIONS -DTEST_KWSYS_CHAR_IS_SIGNED)
+    IF(KWSYS_CHAR_IS_SIGNED_COMPILED)
+      IF(KWSYS_CHAR_IS_SIGNED)
+        MESSAGE(STATUS "Checking signedness of char -- signed")
+        SET(KWSYS_CHAR_IS_SIGNED 1 CACHE INTERNAL "Whether char is signed.")
+      ELSE(KWSYS_CHAR_IS_SIGNED)
+        MESSAGE(STATUS "Checking signedness of char -- unsigned")
+        SET(KWSYS_CHAR_IS_SIGNED 0 CACHE INTERNAL "Whether char is signed.")
+      ENDIF(KWSYS_CHAR_IS_SIGNED)
+    ELSE(KWSYS_CHAR_IS_SIGNED_COMPILED)
+      MESSAGE(FATAL_ERROR "Checking signedness of char -- failed")
+    ENDIF(KWSYS_CHAR_IS_SIGNED_COMPILED)
+  ENDIF("KWSYS_CHAR_IS_SIGNED" MATCHES "^KWSYS_CHAR_IS_SIGNED$")
 ENDIF(KWSYS_USE_FundamentalType)
 
 IF(KWSYS_NAMESPACE MATCHES "^kwsys$")