diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c
index 0cc4a55..0c31b14 100644
--- a/src/foreign/foreign.c
+++ b/src/foreign/foreign.c
@@ -1018,11 +1018,11 @@ static Scheme_Object *get_ctype_base(Scheme_Object *type)
   return type;
 }
 
-/* Returns the size, 0 for void, -1 if no such type */
-static int ctype_sizeof(Scheme_Object *type)
+/* Returns the size, 0 for void or if no such type */
+static size_t ctype_sizeof(Scheme_Object *type)
 {
   type = get_ctype_base(type);
-  if (type == NULL) return -1;
+  if (type == NULL) return 0;
   switch (CTYPE_PRIMLABEL(type)) {
   case FOREIGN_void: return 0;
   case FOREIGN_int8: return sizeof(Tsint8);
@@ -1223,11 +1223,11 @@ static Scheme_Object *foreign_make_array_type(int argc, Scheme_Object *argv[])
   Scheme_Object *base, *basetype;
   GC_CAN_IGNORE ffi_type *libffi_type, **elements;
   ctype_struct *type;
-  intptr_t len;
+  uintptr_t len;
 
   if (NULL == (base = get_ctype_base(argv[0])))
     scheme_wrong_type(MYNAME, "C-type", 0, argc, argv);
-  if (!scheme_get_int_val(argv[1], &len) || (len < 0))
+  if (!scheme_get_unsigned_int_val(argv[1], &len) || (len == 0))
     scheme_wrong_type(MYNAME, "pointer-sized nonnegative exact integer", 1, argc, argv);
 
   /* libffi doesn't seem to support array types, but we try to make
@@ -2034,11 +2034,11 @@ static void* SCHEME2C(Scheme_Object *type, void *dst, intptr_t delta,
 #define MYNAME "ctype-sizeof"
 static Scheme_Object *foreign_ctype_sizeof(int argc, Scheme_Object *argv[])
 {
-  int size;
+  size_t size;
+  if (!SCHEME_CTYPEP(argv[0]))
+    scheme_wrong_type(MYNAME, "C-type", 0, argc, argv);
   size = ctype_sizeof(argv[0]);
-  if (size >= 0) return scheme_make_integer(size);
-  else scheme_wrong_type(MYNAME, "C-type", 0, argc, argv);
-  return NULL; /* hush the compiler */
+  return scheme_make_integer_value_from_unsigned(size);
 }
 #undef MYNAME
 
@@ -2184,7 +2184,8 @@ static Scheme_Object *fail_ok_sym;
 static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[])
 {
   int i, failok=0;
-  intptr_t size=0, num=-1;
+  size_t size=0;
+  intptr_t num=-1;
   void *from = NULL, *res = NULL;
   intptr_t foff = 0;
   Scheme_Object *mode = NULL, *a, *base = NULL;
@@ -2204,7 +2205,7 @@ static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[])
       if (NULL == (base = get_ctype_base(a)))
         scheme_wrong_type(MYNAME, "C-type", i, argc, argv);
       size = ctype_sizeof(a);
-      if (size <= 0)
+      if (size == 0)
         scheme_wrong_type(MYNAME, "non-void-C-type", i, argc, argv);
     } else if (SAME_OBJ(a, fail_ok_sym)) {
       failok = 1;
@@ -2345,9 +2346,9 @@ static Scheme_Object *do_ptr_add(const char *who, int is_bang,
     scheme_wrong_type(who, C_INTPTR_T_TYPE_STR, 1, argc, argv);
   if (argc > 2) {
     if (SCHEME_CTYPEP(argv[2])) {
-      intptr_t size;
+      size_t size;
       size = ctype_sizeof(argv[2]);
-      if (size <= 0) scheme_wrong_type(who, "non-void-C-type", 2, argc, argv);
+      if (size == 0) scheme_wrong_type(who, "non-void-C-type", 2, argc, argv);
       noff = noff * size;
     } else
       scheme_wrong_type(who, "C-type", 2, argc, argv);
@@ -2424,11 +2425,11 @@ static Scheme_Object *foreign_set_ptr_offset_bang(int argc, Scheme_Object *argv[
   }
   if (argc > 2) {
     if (SCHEME_CTYPEP(argv[2])) {
-      intptr_t size;
+      size_t size;
       if (NULL == get_ctype_base(argv[2]))
         scheme_wrong_type(MYNAME, "C-type", 2, argc, argv);
       size = ctype_sizeof(argv[2]);
-      if (size <= 0)
+      if (size == 0)
         scheme_wrong_type(MYNAME, "non-void-C-type", 2, argc, argv);
       noff = noff * size;
     } else
@@ -2452,7 +2453,8 @@ static Scheme_Object *do_memop(const char *who, int mode,
 /* mode 0=>memset, 1=>memmove, 2=>memcpy */
 {
   void *src = NULL, *dest = NULL;
-  intptr_t soff = 0, doff = 0, count, v, mult = 0;
+  intptr_t soff = 0, doff = 0, count, v;
+  size_t mult = 0;
   int i, j, ch = 0, argc1 = argc;
   Scheme_Object *cp;
 
@@ -2463,7 +2465,7 @@ static Scheme_Object *do_memop(const char *who, int mode,
   if (SCHEME_CTYPEP(argv[argc1-1])) {
     argc1--;
     mult = ctype_sizeof(argv[argc1]);
-    if (mult <= 0)
+    if (mult == 0)
       scheme_wrong_type(who, "non-void-C-type", argc1, argc, argv);
   }
 
@@ -2573,7 +2575,8 @@ static Scheme_Object *abs_sym;
 #define MYNAME "ptr-ref"
 static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[])
 {
-  int size=0; void *ptr; Scheme_Object *base;
+  size_t size=0; 
+  void *ptr; Scheme_Object *base;
   intptr_t delta; int gcsrc=1;
   Scheme_Object *cp;
   cp = unwrap_cpointer_property(argv[0]);
@@ -2597,10 +2600,7 @@ static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[])
     }
   }
 
-  if (size < 0) {
-    /* should not happen */
-    scheme_wrong_type(MYNAME, "C-type", 1, argc, argv);
-  } else if (size == 0) {
+  if (size == 0) {
     scheme_wrong_type(MYNAME, "non-void-C-type", 1, argc, argv);
   }
 
@@ -2629,7 +2629,7 @@ static Scheme_Object *foreign_ptr_ref(int argc, Scheme_Object *argv[])
 #define MYNAME "ptr-set!"
 static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[])
 {
-  int size=0; void *ptr;
+  size_t size=0; void *ptr;
   intptr_t delta;
   Scheme_Object *val = argv[argc-1], *base;
   Scheme_Object *cp;
@@ -2642,12 +2642,13 @@ static Scheme_Object *foreign_ptr_set_bang(int argc, Scheme_Object *argv[])
     scheme_wrong_type(MYNAME, "non-null-cpointer", 0, argc, argv);
   if (NULL == (base = get_ctype_base(argv[1])))
     scheme_wrong_type(MYNAME, "C-type", 1, argc, argv);
-  size = ctype_sizeof(base);
-
-  if (size < 0) {
+  
+  if (!SCHEME_CTYPEP(base)) {
     /* should not happen */
     scheme_wrong_type(MYNAME, "C-type", 1, argc, argv);
-  } else if (size == 0) {
+  }
+  size = ctype_sizeof(base);
+  if (size == 0) {
     scheme_wrong_type(MYNAME, "non-void-C-type", 1, argc, argv);
   }
 
