diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 391ae348f8fadf20069d6bc89c488c99751a8c3f..cfd03f4094ea0d5aa04ca51bd8c949ac2d2bb0d0 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -364,7 +364,7 @@ final class REngine implements Engine, Engine.Timings {
                     }
                     lastValue = calls[i].call(new Object[]{executionFrame != null ? executionFrame : newContext.stateREnvironment.getGlobalFrame()});
                 }
-                return lastValue;
+                return RRuntime.r2Java(lastValue);
             } catch (ReturnException ex) {
                 return ex.getResult();
             } catch (DebugExitException | JumpToTopLevelException | ExitException | ThreadDeath e) {
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
index 9f159f813512fb6ae93d57a02795069172011266..c686273f3d38addd4f03ec62f4606c3a1f119595 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/shell/RCommand.java
@@ -308,7 +308,9 @@ public class RCommand {
     private static boolean doEcho(PolyglotEngine vm) {
         PolyglotEngine.Value echoValue = vm.eval(GET_ECHO);
         Object echo = echoValue.get();
-        if (echo instanceof TruffleObject) {
+        if (echo instanceof Boolean) {
+            return (boolean) echo;
+        } else if (echo instanceof TruffleObject) {
             RLogicalVector echoVec = echoValue.as(RLogicalVector.class);
             return RRuntime.fromLogical(echoVec.getDataAt(0));
         } else if (echo instanceof Byte) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
index 75684febae6ee8df37d7d1fd758169b6a918569f..b50be670aff64e6194a116cffdf175381e241629 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/helpers/DebugHandling.java
@@ -598,11 +598,14 @@ public class DebugHandling {
         public void onEnter(EventContext context, VirtualFrame frame) {
             if (!RContext.getInstance().stateInstrumentation.debugGloballyDisabled()) {
                 CompilerDirectives.transferToInterpreter();
-                FunctionDefinitionNode fdn = (FunctionDefinitionNode) context.getInstrumentedNode().getRootNode();
-                FunctionStatementsEventListener ensureSingleStep = ensureSingleStep(fdn);
+                RootNode rootNode = context.getInstrumentedNode().getRootNode();
+                if (rootNode instanceof FunctionDefinitionNode) {
+                    FunctionDefinitionNode fdn = (FunctionDefinitionNode) rootNode;
+                    FunctionStatementsEventListener ensureSingleStep = ensureSingleStep(fdn);
 
-                functionStatementsEventListener.clearStepInstrument();
-                ensureSingleStep.onEnter(context, frame);
+                    functionStatementsEventListener.clearStepInstrument();
+                    ensureSingleStep.onEnter(context, frame);
+                }
             }
         }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
index f338a25c9ac534364d623a9b5a338e3256d0da13..c93bf6935e6818f563f04f9fb608e2a658bee006 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.runtime.env;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.frame.Frame;
+import com.oracle.truffle.api.frame.MaterializedFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.MessageResolution;
@@ -137,8 +138,16 @@ public final class RScope extends AbstractScope {
         return new RScope(node.getRootNode(), getEnv(frame));
     }
 
-    private static Object getInteropValue(Object value) {
-        return value;
+    /**
+     * Explicitly convert some known types to interop types.
+     */
+    private static Object getInteropValue(Object obj) {
+        if (obj instanceof Frame) {
+            MaterializedFrame materialized = ((Frame) obj).materialize();
+            assert RArguments.isRFrame(materialized);
+            return REnvironment.frameToEnvironment(materialized);
+        }
+        return obj;
     }
 
     static final class VariablesMapObject implements TruffleObject {