diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java
index 5642fa86b7857bc1780b2f765ce375f571841be6..df43ab4120f35065ede99648b15d3bd54e3f6d0c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/Foreign2R.java
@@ -30,8 +30,8 @@ import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.interop.UnsupportedMessageException;
-import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.runtime.RInternalError;
+import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.nodes.RBaseNode;
@@ -40,6 +40,7 @@ import com.oracle.truffle.r.runtime.nodes.RBaseNode;
 public abstract class Foreign2R extends RBaseNode {
 
     @Child private Foreign2R recursive;
+    @Child private Node isNull;
     @Child private Node isBoxed;
     @Child private Node unbox;
 
@@ -85,7 +86,15 @@ public abstract class Foreign2R extends RBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    public Object doUnbox(TruffleObject obj) {
+    public Object doForeignObject(TruffleObject obj) {
+        if (isNull == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
+            isNull = insert(Message.IS_NULL.createNode());
+        }
+        if (ForeignAccess.sendIsNull(isNull, obj)) {
+            return RNull.instance;
+        }
+
         /*
          * For the time being, we have to ask "IS_BOXED" all the time (instead of simply trying
          * UNBOX first), because some TruffleObjects return bogus values from UNBOX when IS_BOXED is