diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
index 638946ec8596417fb0afe0821ac21d12d83301ee..d7d74400b22f6ae104736911fcec886318b2df5d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
@@ -122,7 +122,7 @@ public abstract class UpdateAttr extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateAttr(RAbstractContainer container, String name, RNull value) {
         controlVisibility();
         String internedName = intern(name);
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         // the name is interned, so identity comparison is sufficient
         if (internedName == RRuntime.DIM_ATTR_KEY) {
             result.setDimensions(null);
@@ -155,7 +155,7 @@ public abstract class UpdateAttr extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateAttr(RAbstractContainer container, String name, Object value) {
         controlVisibility();
         String internedName = intern(name);
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         // the name is interned, so identity comparison is sufficient
         if (internedName == RRuntime.DIM_ATTR_KEY) {
             RAbstractIntVector dimsVector = castInteger(castVector(value));
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
index b17d4c24aac84d5887b291b9486ecd50d9ac9a0f..90d04224e4413df45ebde4009b277f9124aa4df3 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
@@ -98,7 +98,7 @@ public abstract class UpdateAttributes extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateAttributes(RAbstractVector abstractVector, @SuppressWarnings("unused") RNull list) {
         controlVisibility();
-        RAbstractVector resultVector = (RAbstractVector) abstractVector.materializeNonShared();
+        RAbstractVector resultVector = (RAbstractVector) abstractVector.getNonShared();
         resultVector.resetAllAttributes(true);
         return resultVector;
     }
@@ -111,7 +111,7 @@ public abstract class UpdateAttributes extends RInvisibleBuiltinNode {
             throw RError.error(this, RError.Message.ATTRIBUTES_NAMED);
         }
         RStringVector listNames = (RStringVector) listNamesObject;
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (numAttributesProfile.profile(list.getLength() == 0)) {
             result.resetAllAttributes(true);
         } else {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
index cd33324c69dc387941c29c28280a7709d5cd0b78..518f22a57ccb58a104092a5d3eb3e2cf588c540f 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
@@ -76,7 +76,7 @@ public abstract class UpdateClass extends RBuiltinNode {
     protected Object setClass(RAbstractContainer arg, @SuppressWarnings("unused") RNull className) {
         controlVisibility();
 
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(null, false);
     }
 
@@ -111,7 +111,7 @@ public abstract class UpdateClass extends RBuiltinNode {
                 return setClass((RAbstractVector) result, RNull.instance);
             }
         }
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         if (result instanceof RAbstractVector) {
             RAbstractVector resultVector = (RAbstractVector) result;
             if (RType.Matrix.getName().equals(className)) {
@@ -138,7 +138,7 @@ public abstract class UpdateClass extends RBuiltinNode {
     @TruffleBoundary
     protected Object setClass(RAbstractContainer arg, RStringVector className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(className, false);
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
index f60fdc88af1603b2378b62c9353df2c9191d6069..920f33a652d25854fd3e1f341e68ba6e4d7966df 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
@@ -52,7 +52,7 @@ public abstract class UpdateDim extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateDim(RAbstractVector vector, @SuppressWarnings("unused") RNull dimensions) {
         controlVisibility();
-        RVector result = (RVector) vector.materializeNonShared();
+        RVector result = (RVector) vector.getNonShared();
         result.resetDimensions(null);
         return result;
     }
@@ -66,7 +66,7 @@ public abstract class UpdateDim extends RInvisibleBuiltinNode {
         }
         int[] dimsData = castInteger(dimensions).materialize().getDataCopy();
         RVector.verifyDimensions(vector.getLength(), dimsData, this);
-        RVector result = (RVector) vector.materializeNonShared();
+        RVector result = (RVector) vector.getNonShared();
         result.resetDimensions(dimsData);
         return result;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
index 56b3c8c2b86441d86a6e61607ef915af7b1d5ee8..5e604e8492d7d897056356d40f17e3cc68c0e643 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
@@ -94,7 +94,7 @@ public abstract class UpdateDimNames extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateDimnamesNull(RAbstractContainer container, @SuppressWarnings("unused") RNull list, //
                     @Cached("create(DIMNAMES_ATTR_KEY)") RemoveAttributeNode remove) {
         controlVisibility();
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (isRVectorProfile.profile(container instanceof RVector)) {
             RVector vector = (RVector) container;
             if (vector.getInternalDimNames() != null) {
@@ -117,7 +117,7 @@ public abstract class UpdateDimNames extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateDimnames(RAbstractContainer container, RList list, //
                     @Cached("create(DIMNAMES_ATTR_KEY)") PutAttributeNode put) {
         controlVisibility();
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         setDimNames(result, convertToListOfStrings(list), put);
         return result;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
index 0d3d387ae3876196022c19cb9b30c9986a3764fa..f1c8b0c90c229a39c25441613f00dfe9767fb050 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
@@ -43,7 +43,7 @@ public abstract class UpdateLevels extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateLevels(RAbstractVector vector, @SuppressWarnings("unused") RNull levels) {
         controlVisibility();
-        RVector v = (RVector) vector.materializeNonShared();
+        RVector v = (RVector) vector.getNonShared();
         v.removeAttr(attrProfiles, RRuntime.LEVELS_ATTR_KEY);
         return v;
     }
@@ -51,7 +51,7 @@ public abstract class UpdateLevels extends RInvisibleBuiltinNode {
     @Specialization(guards = "levelsNotNull(levels)")
     protected RAbstractVector updateLevels(RAbstractVector vector, Object levels) {
         controlVisibility();
-        RVector v = (RVector) vector.materializeNonShared();
+        RVector v = (RVector) vector.getNonShared();
         v.setAttr(RRuntime.LEVELS_ATTR_KEY, castVector(levels));
         return v;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
index 1ff67547bc22a99ce42cc140f18880eab1726f90..4ff586756d9a60c91f905d0f030e3711cbb1b710 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
@@ -58,7 +58,7 @@ public abstract class UpdateNames extends RInvisibleBuiltinNode {
         controlVisibility();
         Object newNames = castString(names);
         if (newNames == RNull.instance) {
-            RAbstractContainer result = container.materializeNonShared();
+            RAbstractContainer result = (RAbstractContainer) container.getNonShared();
             result.setNames(null);
             return result;
         }
@@ -69,7 +69,7 @@ public abstract class UpdateNames extends RInvisibleBuiltinNode {
         } else {
             stringVector = (RStringVector) ((RAbstractVector) newNames).materialize();
         }
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (stringVector.getLength() < result.getLength()) {
             stringVector = stringVector.copyResized(result.getLength(), true);
         } else if (stringVector == container) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
index 2e9e238247615b97e6a94296882e1f81d1c8777c..ced6ef86dc12a12de8c27ecae2555993f6dc9131 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
@@ -73,7 +73,7 @@ public abstract class UpdateOldClass extends RInvisibleBuiltinNode {
     @TruffleBoundary
     protected Object setOldClass(RAbstractContainer arg, RStringVector className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(className, false);
     }
 
@@ -81,7 +81,7 @@ public abstract class UpdateOldClass extends RInvisibleBuiltinNode {
     @TruffleBoundary
     protected Object setOldClass(RAbstractContainer arg, @SuppressWarnings("unused") RNull className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(null, false);
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
index 6c0435a2331e44dd7ed1930a6bbbeb34af9ce1bf..4166d6769e61f47b19a8fcf908cf34e27d2392e3 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
@@ -30,6 +30,7 @@ import com.oracle.truffle.api.source.SourceSection;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RSerialize;
 import com.oracle.truffle.r.runtime.data.RShareable;
+import com.oracle.truffle.r.runtime.data.RTypedValue;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.nodes.RNode;
 import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
@@ -41,7 +42,7 @@ public abstract class GetNonSharedNode extends RNode implements RSyntaxNode {
     private final ValueProfile shareableTypeProfile = ValueProfile.createClassProfile();
 
     @Specialization
-    protected RShareable getNonShared(RShareable shareable) {
+    protected RTypedValue getNonShared(RShareable shareable) {
         return shareableTypeProfile.profile(shareable).getNonShared();
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
index 770f37352da5afd6dc6ee1d7248b2566f5962274..58a135e705e73f61cd5b64a1d618a6887615c5dd 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
@@ -346,7 +346,7 @@ public class ConnectionSupport {
 
     // TODO implement all open modes
 
-    public static class InvalidConnection extends RConnection {
+    public static final class InvalidConnection extends RConnection {
 
         public static final InvalidConnection instance = new InvalidConnection();
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
index 62dfc593511b0f906534477dc6fa8c6a19bc8067..10f69829220c49fb43baa959cdc872f909715487 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
@@ -370,7 +370,7 @@ public abstract class RConnection extends RAttributeStorage implements RTypedVal
     }
 
     @Override
-    public RAbstractContainer materializeNonShared() {
+    public RTypedValue getNonShared() {
         return this;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
index a365680d20d128c48ab93657ad3970982033a771..c3bcbb942181b6019f985074c807cbaeb18609ec 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
@@ -115,12 +115,6 @@ public class RExpression implements RShareable, RAbstractContainer {
         return RExpression.class;
     }
 
-    @Override
-    public RExpression materializeNonShared() {
-        RVector d = data.materializeNonShared();
-        return data != d ? RDataFactory.createExpression((RList) d) : this;
-    }
-
     @Override
     public Object getDataAtAsObject(int index) {
         return data.getDataAtAsObject(index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
index a053031e4e044207e4ceed3c5c538314a280e247..46b363d3d63d4a37c0bb477f2babf628b8616ca4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
@@ -128,7 +128,7 @@ public class RLanguage extends RSharingAttributeStorage implements RAbstractCont
     }
 
     @Override
-    public RLanguage materializeNonShared() {
+    public RLanguage getNonShared() {
         return (RLanguage) getNonShared();
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
index b265557d72aa6a0bfbbd8ece789dfde9b2267332..bc3fe353635825c7ea4c1a29f1243ce8e3efc234 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
@@ -236,7 +236,7 @@ public class RPairList extends RAttributeStorage implements RAbstractContainer {
     }
 
     @Override
-    public RVector materializeNonShared() {
+    public RVector getNonShared() {
         RInternalError.shouldNotReachHere();
         return null;
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
index e494a76e15735df71912cfae0f58a732814e44fc..6d7ddced925c96d8bebedfbb4b98892d18dba52f 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
@@ -81,8 +81,8 @@ public abstract class RScalarVector extends RScalar implements RAbstractVector {
     }
 
     @Override
-    public RAbstractContainer materializeNonShared() {
-        return materialize().materializeNonShared();
+    public RTypedValue getNonShared() {
+        return materialize().getNonShared();
     }
 
     @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
index bac78060ac764a9f604c3357e0031fedff2729f5..20b9d77fca3686764098a20939ec131d072c04c9 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
@@ -169,9 +169,8 @@ public abstract class RSequence implements RAbstractVector {
     }
 
     @Override
-    public final RVector materializeNonShared() {
-        RVector resultVector = this.materialize().materializeNonShared();
-        return resultVector;
+    public final RTypedValue getNonShared() {
+        return materialize().getNonShared();
     }
 
     @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
index 029e4443be0f1e1e5279f0d9cbfc1d31b3fd56ae..2e008ca8f5facebe3c0641fde1cd26170035eaf0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
@@ -22,7 +22,7 @@
  */
 package com.oracle.truffle.r.runtime.data;
 
-public interface RShareable {
+public interface RShareable extends RTypedValue {
 
     // SHARED_PERMANENT_VAL describes both overflow value and a value that can be set to prevent
     // further updates to ref count (for sharing between different threads) - can potentially be
@@ -48,6 +48,6 @@ public interface RShareable {
 
     void makeSharedPermanent();
 
-    RShareable getNonShared();
+    RTypedValue getNonShared();
 
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
index a915cdb26f7d7fbd646c660a55c3491af963bc73..f87a82b76a8197add0a2772ee67f94b133ae5dd0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
@@ -61,7 +61,7 @@ public abstract class RSharingAttributeStorage extends RAttributeStorage impleme
     }
 
     @Override
-    public RShareable getNonShared() {
+    public RTypedValue getNonShared() {
         if (isShared()) {
             RShareable res = copy();
             assert res.isTemporary();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
index 9292adf55f7794dcdcb8e2696eff364b578e5890..d1984cecaa8b7690c10585aac8e5b10fc07e34d2 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
@@ -788,11 +788,6 @@ public abstract class RVector extends RSharingAttributeStorage implements RShare
         return implicitClassHeader;
     }
 
-    @Override
-    public RVector materializeNonShared() {
-        return (RVector) getNonShared();
-    }
-
     @Override
     public final RShareable materializeToShareable() {
         return materialize();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
index 21952499cc71457ff6317756bc8985a0387ee086..98c8a9b3b5d7f5eb3862b274c3cdb034a111838b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.r.runtime.data.RAttributes;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.RTypedValue;
 import com.oracle.truffle.r.runtime.data.RVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -45,7 +46,7 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public Void getInternalStore() {
+    public final Void getInternalStore() {
         return null;
     }
 
@@ -164,7 +165,7 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public RStringVector getImplicitClass() {
+    public final RStringVector getImplicitClass() {
         return vector.getImplicitClass();
     }
 
@@ -174,8 +175,8 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public final RAbstractVector materializeNonShared() {
-        return (RAbstractVector) vector.materializeNonShared();
+    public final RTypedValue getNonShared() {
+        return vector.getNonShared();
     }
 
     @Override
@@ -184,17 +185,17 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public int getGPBits() {
+    public final int getGPBits() {
         return vector.getGPBits();
     }
 
     @Override
-    public void setGPBits(int value) {
+    public final void setGPBits(int value) {
         vector.setGPBits(value);
     }
 
     @Override
-    public boolean isS4() {
+    public final boolean isS4() {
         return false;
     }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
index ebe23dd5ce124f744a817b151e4f6ff32c85dbef..befd4e867877b9b1375e1184dec6ca9686960c2e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
@@ -45,7 +45,7 @@ public interface RAbstractContainer extends RAttributable, RTypedValue {
 
     Class<?> getElementClass();
 
-    RAbstractContainer materializeNonShared();
+    RTypedValue getNonShared();
 
     RShareable materializeToShareable();