diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
index 5729da8e806eecafb34d9f837a78c0e94e5fff95..0050adfe49186425b3ab3a4976f68cb05493767a 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c
@@ -385,15 +385,11 @@ cetype_t Rf_getCharCE(SEXP x) {
 }
 
 SEXP Rf_mkChar(const char *x) {
-	JNIEnv *thisenv = getEnv();
-	// TODO encoding, assume UTF for now
-	SEXP result = (*thisenv)->NewStringUTF(thisenv, x);
-	return checkRef(thisenv, result);
+	return Rf_mkCharLenCE(x, strlen(x), CE_NATIVE);
 }
 
 SEXP Rf_mkCharCE(const char *x, cetype_t y) {
-	unimplemented("Rf_mkCharCE");
-	return NULL;
+	return Rf_mkCharLenCE(x, strlen(x), y);
 }
 
 SEXP Rf_mkCharLen(const char *x, int y) {
@@ -416,9 +412,7 @@ const char *Rf_reEnc(const char *x, cetype_t ce_in, cetype_t ce_out, int subst)
 }
 
 SEXP Rf_mkString(const char *s) {
-	JNIEnv *thisenv = getEnv();
-	jstring string = (*thisenv)->NewStringUTF(thisenv, s);
-	return ScalarString(string);
+	return ScalarString(Rf_mkChar(s));
 }
 
 int Rf_ncols(SEXP x) {
diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
index 9953c78ba72e1561b09c210d31ff19e0d29f8e03..aee0e8150f5fc3623c0e948fda552ac500f00128 100644
--- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
+++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c
@@ -231,7 +231,9 @@ static SEXP checkCachedGlobalRef(JNIEnv *env, SEXP obj) {
 void validateRef(JNIEnv *env, SEXP x, const char *msg) {
 	jobjectRefType t = (*env)->GetObjectRefType(env, x);
 	if (t == JNIInvalidRefType) {
-		fatalError(msg);
+		char buf[1000];
+		sprintf(buf, "%s %p", msg,x);
+		fatalError(buf);
 	}
 }
 
diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
index e57c1b5e99def50ee19345f56609135e97db8a50..99923af008067940d30799b7aa400db7d86ad6e5 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
@@ -56,6 +56,8 @@ import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RUnboundValue;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
+import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.env.REnvironment.PutException;
@@ -100,12 +102,23 @@ public class CallRFFIHelper {
         }
     }
 
-    private static void guaranteeInstanceOf(Object x, Class<?> clazz) {
+    private static <T> T guaranteeInstanceOf(Object x, Class<T> clazz) {
         if (x == null) {
             guarantee(false, "unexpected type: null instead of " + clazz.getSimpleName());
         } else if (!clazz.isInstance(x)) {
             guarantee(false, "unexpected type: " + x + " is " + x.getClass().getSimpleName() + " instead of " + clazz.getSimpleName());
         }
+        return clazz.cast(x);
+    }
+
+    private static <T> T guaranteeInstanceOfOrNull(Object x, Class<T> clazz) {
+        if (x == null) {
+            return null;
+        }
+        if (!clazz.isInstance(x)) {
+            guarantee(false, "unexpected type: " + x + " is " + x.getClass().getSimpleName() + " instead of " + clazz.getSimpleName());
+        }
+        return clazz.cast(x);
     }
 
     // Checkstyle: stop method name check
@@ -395,8 +408,7 @@ public class CallRFFIHelper {
     }
 
     public static void SET_VECTOR_ELT(Object x, int i, Object v) {
-        // TODO error checks
-        RList list = (RList) x;
+        RList list = guaranteeInstanceOf(x, RList.class);
         list.setElement(i, v);
     }
 
@@ -473,11 +485,8 @@ public class CallRFFIHelper {
     }
 
     public static Object VECTOR_ELT(Object x, int i) {
-        if (x instanceof RList) {
-            return ((RList) x).getDataAt(i);
-        } else {
-            throw unimplemented();
-        }
+        RAbstractListVector list = guaranteeInstanceOf(RRuntime.asAbstractVector(x), RAbstractListVector.class);
+        return list.getDataAt(i);
     }
 
     public static int NAMED(Object x) {