diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java
index ce22e93b4542dbf95490f7ca5945c6ca68d4de3c..837bd534627de17d70d12b97ec38c6f6e873ad64 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Paste.java
@@ -271,7 +271,7 @@ public abstract class Paste extends RBuiltinNode.Arg3 {
     private CastNode getAsCharacterNode() {
         if (asCharacterNode == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            asCharacterNode = insert(newCastBuilder().returnIf(nullValue(), emptyStringVector()).asStringVector().buildCastNode());
+            asCharacterNode = insert(newCastBuilder().castForeignObjects(true).returnIf(nullValue(), emptyStringVector()).asStringVector().buildCastNode());
         }
         return asCharacterNode;
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java
index d52436f13ffcd2a8cfbc91a5a16d5ed68538cb99..687c4fce806f0fd1f3ea91763bb59686e0962052 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/CastForeignNode.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.nodes.builtin.casts;
 
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.nodes.unary.CastNode;
+import com.oracle.truffle.r.runtime.data.RInteropScalar;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
 public final class CastForeignNode extends CastNode {
@@ -31,13 +32,20 @@ public final class CastForeignNode extends CastNode {
     @Child private ForeignArray2R foreignArray2R = ForeignArray2R.create();
 
     private final ConditionProfile isForeign = ConditionProfile.createBinaryProfile();
+    private final ConditionProfile isInteropScalar = ConditionProfile.createBinaryProfile();
 
     @Override
     protected Object execute(Object obj) {
         if (isForeign.profile(foreignArray2R.isForeignVector(obj))) {
             return foreignArray2R.convert(obj);
+        } else if (isInteropScalar.profile(isInteropScalar(obj))) {
+            return ((RInteropScalar) obj).getRValue();
         } else {
             return obj;
         }
     }
+
+    protected boolean isInteropScalar(Object obj) {
+        return obj instanceof RInteropScalar;
+    }
 }