diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 2b6ab9b0569..7f3b0a05c10 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -594,13 +594,7 @@ fn make_ty_info(@crate_ctxt cx, @typeck.ty ty) {
 
 fn make_generic_glue(@crate_ctxt cx, @typeck.ty t, str name,
                      val_and_ty_fn helper) -> ValueRef {
-    auto arg_t;
-    if (typeck.type_is_structural(t)) {
-        arg_t = T_ptr(type_of(cx, t));
-    } else {
-        arg_t = type_of(cx, t);
-    }
-    auto llfnty = T_fn(vec(T_taskptr(), arg_t), T_void());
+    auto llfnty = T_fn(vec(T_taskptr(), T_ptr(T_i8())), T_void());
 
     auto fn_name = cx.names.next("_rust_" + name) + "." + typeck.ty_to_str(t);
     fn_name = sanitize(fn_name);
@@ -609,11 +603,24 @@ fn make_generic_glue(@crate_ctxt cx, @typeck.ty t, str name,
     auto fcx = new_fn_ctxt(cx, fn_name, llfn);
     auto bcx = new_top_block_ctxt(fcx);
 
-    auto llval = llvm.LLVMGetParam(llfn, 1u);
+    auto re;
+    if (!typeck.type_is_scalar(t)) {
+        auto llty;
+        if (typeck.type_is_structural(t)) {
+            llty = T_ptr(type_of(cx, t));
+        } else {
+            llty = type_of(cx, t);
+        }
 
-    auto res = helper(bcx, llval, t);
+        auto llrawptr = llvm.LLVMGetParam(llfn, 1u);
+        auto llval = bcx.build.BitCast(llrawptr, llty);
+        
+        re = helper(bcx, llval, t);
+    } else {
+        re = res(bcx, C_nil());
+    }
 
-    res.bcx.build.RetVoid();
+    re.bcx.build.RetVoid();
     ret llfn;
 }
 
@@ -960,8 +967,11 @@ fn iter_sequence(@block_ctxt cx,
 fn incr_all_refcnts(@block_ctxt cx,
                     ValueRef v,
                     @typeck.ty t) -> result {
-    cx.build.FastCall(get_ty_info(cx.fcx.ccx, t).take_glue,
-                      vec(cx.fcx.lltaskptr, v));
+    if (!typeck.type_is_scalar(t)) {
+        auto llrawptr = cx.build.BitCast(v, T_ptr(T_i8()));
+        cx.build.FastCall(get_ty_info(cx.fcx.ccx, t).take_glue,
+                          vec(cx.fcx.lltaskptr, llrawptr));
+    }
     ret res(cx, C_nil());
 }
 
@@ -980,8 +990,11 @@ fn drop_slot(@block_ctxt cx,
 fn drop_ty(@block_ctxt cx,
            ValueRef v,
            @typeck.ty t) -> result {
-    cx.build.FastCall(get_ty_info(cx.fcx.ccx, t).drop_glue,
-                      vec(cx.fcx.lltaskptr, v));
+    if (!typeck.type_is_scalar(t)) {
+        auto llrawptr = cx.build.BitCast(v, T_ptr(T_i8()));
+        cx.build.FastCall(get_ty_info(cx.fcx.ccx, t).drop_glue,
+                          vec(cx.fcx.lltaskptr, llrawptr));
+    }
     ret res(cx, C_nil());
 }
 
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 1ce7862c78e..41c3bbb6120 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -887,6 +887,7 @@ fn type_is_boxed(@ty t) -> bool {
 
 fn type_is_scalar(@ty t) -> bool {
     alt (t.struct) {
+        case (ty_nil) { ret true; }
         case (ty_bool) { ret true; }
         case (ty_int) { ret true; }
         case (ty_uint) { ret true; }