diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java
index 2f10a3fe8310c1fbf40973223218e7ea77cb6e68..ef17882695395991db0afa2e0299a20edf68c81a 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/FrameSlotNode.java
@@ -90,6 +90,7 @@ public abstract class FrameSlotNode extends Node {
         }
 
         private FrameSlotNode resolveFrameSlot(Frame frame) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             FrameSlotNode newNode;
             FrameSlot frameSlot;
             if (createIfAbsent) {
@@ -137,6 +138,8 @@ public abstract class FrameSlotNode extends Node {
         private final ConditionProfile initializedProfile = ConditionProfile.createBinaryProfile();
         private final FrameSlot frameSlot;
 
+        private final ValueProfile frameTypeProfile = ValueProfile.createClassProfile();
+
         public PresentFrameSlotNode(FrameSlot frameSlot) {
             this.frameSlot = frameSlot;
         }
@@ -146,9 +149,10 @@ public abstract class FrameSlotNode extends Node {
             return frameSlot;
         }
 
-        private static boolean isInitialized(Frame frame, FrameSlot frameSlot) {
+        private boolean isInitialized(Frame frame) {
             try {
-                return !frame.isObject(frameSlot) || frame.getObject(frameSlot) != null;
+                Frame typedFrame = frameTypeProfile.profile(frame);
+                return !typedFrame.isObject(frameSlot) || typedFrame.getObject(frameSlot) != null;
             } catch (FrameSlotTypeException e) {
                 throw new IllegalStateException();
             }
@@ -156,7 +160,7 @@ public abstract class FrameSlotNode extends Node {
 
         @Override
         public boolean hasValue(Frame frame) {
-            return initializedProfile.profile(isInitialized(frame, frameSlot));
+            return initializedProfile.profile(isInitialized(frame));
         }
     }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java
index 70f5564b368bc8dc95ce0f082be9d6c5905474fc..605657731b3f39ab7acefac1dffedf888376ac9a 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadVariableNode.java
@@ -30,6 +30,7 @@ import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.source.*;
+import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.nodes.*;
 import com.oracle.truffle.r.nodes.access.ReadVariableNodeFactory.BuiltinFunctionVariableNodeFactory;
 import com.oracle.truffle.r.nodes.access.ReadVariableNodeFactory.ReadAndCopySuperVariableNodeFactory;
@@ -543,6 +544,8 @@ public abstract class ReadVariableNode extends RNode implements VisibilityContro
         private final boolean readMissing;
         private final boolean forcePromise;
 
+        private final ValueProfile frameTypeProfile = ValueProfile.createClassProfile();
+
         ReadVariableMaterializedNode(ReadSuperVariableNode readNode, ReadVariableNode nextNode, boolean readMissing, boolean forcePromise, String mode) {
             this.readNode = readNode;
             this.nextNode = nextNode;
@@ -560,13 +563,14 @@ public abstract class ReadVariableNode extends RNode implements VisibilityContro
         @Override
         public Object execute(VirtualFrame frame, MaterializedFrame enclosingFrame) {
             controlVisibility();
-            if (readNode.getFrameSlotNode().hasValue(enclosingFrame)) {
-                Object result = readNode.execute(frame, enclosingFrame);
+            MaterializedFrame typedEnclosingFrame = frameTypeProfile.profile(enclosingFrame);
+            if (readNode.getFrameSlotNode().hasValue(typedEnclosingFrame)) {
+                Object result = readNode.execute(frame, typedEnclosingFrame);
                 if (checkType(frame, result, mode, readMissing, forcePromise)) {
                     return result;
                 }
             }
-            return nextNode.execute(frame, RArguments.getEnclosingFrame(enclosingFrame));
+            return nextNode.execute(frame, RArguments.getEnclosingFrame(typedEnclosingFrame));
         }
 
         @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
index 46979ab66b15a3bcb05190653ad4abb7a7ac61a8..09ec5a56cc76273111331f87ee8383b52bb47159 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RArguments.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.runtime;
 
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.source.*;
+import com.oracle.truffle.api.utilities.*;
 import com.oracle.truffle.r.runtime.data.*;
 import com.oracle.truffle.r.runtime.env.*;
 
@@ -99,6 +100,8 @@ public final class RArguments {
      */
     public static final int MINIMAL_ARRAY_LENGTH = 6;
 
+    private static final ValueProfile materializedFrameProfile = ValueProfile.createClassProfile();
+
     private RArguments() {
     }
 
@@ -110,7 +113,7 @@ public final class RArguments {
     private static Object[] getArgumentsWithEvalCheck(Frame frame) {
         Object[] arguments = frame.getArguments();
         if (arguments.length == 1) {
-            return ((Frame) arguments[0]).getArguments();
+            return materializedFrameProfile.profile((Frame) arguments[0]).getArguments();
         } else {
             return arguments;
         }