diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
index dc6bab1f9142ce475c6ab6efb1bcb5504b9a4562..ac113eb0c847abb0ebd0b80aaeab2511bff714da 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
@@ -36,15 +36,16 @@ import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
-import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -168,12 +169,12 @@ public abstract class CastComplexNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RComplexVector doLogicalVector(RLogicalVector operand) {
+    protected RComplexVector doLogicalVector(RAbstractLogicalVector operand) {
         return createResultVector(operand, index -> naCheck.convertLogicalToComplex(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RComplexVector doStringVector(RStringVector operand,
+    protected RComplexVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile) {
         naCheck.enable(operand);
         double[] ddata = new double[operand.getLength() << 1];
@@ -211,12 +212,12 @@ public abstract class CastComplexNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RComplexVector doComplexVector(RComplexVector vector) {
+    protected RAbstractComplexVector doComplexVector(RAbstractComplexVector vector) {
         return vector;
     }
 
     @Specialization
-    protected RComplexVector doRawVector(RRawVector operand) {
+    protected RComplexVector doRawVector(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RDataFactory.createComplex(operand.getRawDataAt(index), 0));
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
index ef5078d262fe5c861850108a366bd2f55e6c0f4b..f0dd71f992271cb472a238e484f40d7e127382ae 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
@@ -36,17 +36,17 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RList;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
@@ -123,7 +123,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization
-    protected RDoubleVector doStringVector(RStringVector operand,
+    protected RDoubleVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile,
                     @Cached("create()") BranchProfile warningBranch) {
         naCheck.enable(operand);
@@ -160,7 +160,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization
-    protected RDoubleVector doComplexVector(RComplexVector operand) {
+    protected RDoubleVector doComplexVector(RAbstractComplexVector operand) {
         naCheck.enable(operand);
         double[] ddata = new double[operand.getLength()];
         boolean warning = false;
@@ -223,16 +223,16 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RDoubleVector doForeignObject(TruffleObject obj,
+    protected RAbstractDoubleVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RDoubleVector) {
-                return (RDoubleVector) o;
+            if (o instanceof RAbstractDoubleVector) {
+                return (RAbstractDoubleVector) o;
             }
             o = castDoubleRecursive(o);
-            if (o instanceof RDoubleVector) {
-                return (RDoubleVector) o;
+            if (o instanceof RAbstractDoubleVector) {
+                return (RAbstractDoubleVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
index 940f8c673b9682366058a3a879260542be90f4ae..558b86015a62ecafe6edd553d551a195b6c51108 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
@@ -231,16 +231,16 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RIntVector doForeignObject(TruffleObject obj,
+    protected RAbstractIntVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RIntVector) {
-                return (RIntVector) o;
+            if (o instanceof RAbstractIntVector) {
+                return (RAbstractIntVector) o;
             }
             o = castIntegerRecursive(o);
-            if (o instanceof RIntVector) {
-                return (RIntVector) o;
+            if (o instanceof RAbstractIntVector) {
+                return (RAbstractIntVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
index 1d734075f147b55cb99371fe8d2405b1568f6870..17b784f1b10aa500aa9c300a8a0273c31ef53a35 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
@@ -32,17 +32,18 @@ import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.r.nodes.helpers.InheritsCheckNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -111,7 +112,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization
-    protected RLogicalVector doLogicalVector(RLogicalVector operand) {
+    protected RAbstractLogicalVector doLogicalVector(RAbstractLogicalVector operand) {
         return operand;
     }
 
@@ -133,17 +134,17 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization
-    protected RLogicalVector doStringVector(RStringVector operand) {
+    protected RLogicalVector doStringVector(RAbstractStringVector operand) {
         return createResultVector(operand, index -> naCheck.convertStringToLogical(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RLogicalVector doComplexVector(RComplexVector operand) {
+    protected RLogicalVector doComplexVector(RAbstractComplexVector operand) {
         return createResultVector(operand, index -> naCheck.convertComplexToLogical(operand.getDataAt(index)));
     }
 
     @Specialization
-    protected RLogicalVector doRawVectorDims(RRawVector operand) {
+    protected RLogicalVector doRawVectorDims(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RRuntime.raw2logical(operand.getRawDataAt(index)));
     }
 
@@ -193,16 +194,16 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RLogicalVector doForeignObject(TruffleObject obj,
+    protected RAbstractLogicalVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RLogicalVector) {
-                return (RLogicalVector) o;
+            if (o instanceof RAbstractLogicalVector) {
+                return (RAbstractLogicalVector) o;
             }
             o = castLogicalRecursive(o);
             if (o instanceof RLogicalVector) {
-                return (RLogicalVector) o;
+                return (RAbstractLogicalVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
index 44b0149e20f5b7a5f4ccdaa3dc216fadb01a3d16..541bb6d9a250ce1a4691b07c386a8fcb5a4c7279 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
@@ -31,17 +31,18 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
-import com.oracle.truffle.r.runtime.data.RLogicalVector;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
 import com.oracle.truffle.r.runtime.data.RRawVector;
-import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -185,7 +186,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doLogicalVector(RLogicalVector operand) {
+    protected RRawVector doLogicalVector(RAbstractLogicalVector operand) {
         byte[] bdata = new byte[operand.getLength()];
         boolean warning = false;
         for (int i = 0; i < operand.getLength(); i++) {
@@ -205,7 +206,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doStringVector(RStringVector operand,
+    protected RRawVector doStringVector(RAbstractStringVector operand,
                     @Cached("createBinaryProfile()") ConditionProfile emptyStringProfile,
                     @Cached("create()") NAProfile naProfile) {
         naCheck.enable(operand);
@@ -245,7 +246,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doComplexVector(RComplexVector operand) {
+    protected RRawVector doComplexVector(RAbstractComplexVector operand) {
         byte[] bdata = new byte[operand.getLength()];
         boolean imaginaryDiscardedWarning = false;
         boolean outOfRangeWarning = false;
@@ -294,7 +295,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     @Specialization
-    protected RRawVector doRawVector(RRawVector operand) {
+    protected RAbstractRawVector doRawVector(RAbstractRawVector operand) {
         return operand;
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
index b9406a1420f983e85e9545d369f3bf3448008a30..8210498a21ccb4f7a9af213c0b3572419b7494a0 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
@@ -39,6 +39,7 @@ import com.oracle.truffle.r.runtime.data.RStringSequence;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
 
 @ImportStatic(RRuntime.class)
@@ -76,12 +77,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
     }
 
     @Specialization
-    protected RStringVector doStringVector(RStringVector vector) {
-        return vector;
-    }
-
-    @Specialization
-    protected RStringSequence doStringSequence(RStringSequence vector) {
+    protected RAbstractStringVector doStringVector(RAbstractStringVector vector) {
         return vector;
     }
 
@@ -90,7 +86,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
         return RDataFactory.createStringSequence("", "", vector.getStart(), vector.getStride(), vector.getLength());
     }
 
-    @Specialization(guards = "!isIntSequence(operandIn)")
+    @Specialization(guards = {"!isIntSequence(operandIn)", "!isRAbstractStringVector(operandIn)"})
     protected RStringVector doAbstractContainer(RAbstractContainer operandIn,
                     @Cached("createClassProfile()") ValueProfile operandProfile,
                     @Cached("createBinaryProfile()") ConditionProfile isLanguageProfile) {
@@ -109,16 +105,16 @@ public abstract class CastStringNode extends CastStringBaseNode {
     }
 
     @Specialization(guards = "isForeignObject(obj)")
-    protected RStringVector doForeignObject(TruffleObject obj,
+    protected RAbstractStringVector doForeignObject(TruffleObject obj,
                     @Cached("create()") ForeignArray2R foreignArray2R) {
         Object o = foreignArray2R.convert(obj);
         if (!RRuntime.isForeignObject(o)) {
-            if (o instanceof RStringVector) {
-                return (RStringVector) o;
+            if (o instanceof RAbstractStringVector) {
+                return (RAbstractStringVector) o;
             }
             o = castStringRecursive(o);
-            if (o instanceof RStringVector) {
-                return (RStringVector) o;
+            if (o instanceof RAbstractStringVector) {
+                return (RAbstractStringVector) o;
             }
         }
         throw error(RError.Message.CANNOT_COERCE_EXTERNAL_OBJECT_TO_VECTOR, "vector");
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
index 8da573de72bf449d6f53632d3d39e8500558ea79..12dd537fa27f2ddbc65cb756e78e49948a3bee82 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
@@ -41,6 +41,7 @@ import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RExpression;
+import com.oracle.truffle.r.runtime.data.RForeignListWrapper;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RInteropScalar;
 import com.oracle.truffle.r.runtime.data.RLanguage;
@@ -53,6 +54,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractListVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@@ -157,6 +159,16 @@ public abstract class PrecedenceNode extends RBaseNode {
     @Specialization(guards = "recursive")
     protected int doListRecursive(RList val, boolean recursive,
                     @Cached("createRecursive()") PrecedenceNode precedenceNode) {
+        return doListRecursiveInternal(val, precedenceNode, recursive);
+    }
+
+    @Specialization(guards = "recursive")
+    protected int doListRecursive(RForeignListWrapper val, boolean recursive,
+                    @Cached("createRecursive()") PrecedenceNode precedenceNode) {
+        return doListRecursiveInternal(val, precedenceNode, recursive);
+    }
+
+    private int doListRecursiveInternal(RAbstractListVector val, PrecedenceNode precedenceNode, boolean recursive) {
         int precedence = -1;
         for (int i = 0; i < val.getLength(); i++) {
             precedence = Math.max(precedence, precedenceNode.executeInteger(val.getDataAt(i), recursive));
@@ -184,6 +196,12 @@ public abstract class PrecedenceNode extends RBaseNode {
         return LIST_PRECEDENCE;
     }
 
+    @Specialization(guards = "!recursive")
+    @SuppressWarnings("unused")
+    protected int doList(RForeignListWrapper val, boolean recursive) {
+        return LIST_PRECEDENCE;
+    }
+
     @Specialization(guards = "!recursive")
     @SuppressWarnings("unused")
     protected int doPairList(RPairList val, boolean recursive) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
index 7230d7b17e60bd571680b3792d0dc235d8562e0c..aa040654c312bf5aa981c0cdd1f243a10227ec25 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryArithmeticReduceNode.java
@@ -35,13 +35,13 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RComplexVector;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RTypes;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
@@ -318,7 +318,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = "supportComplex")
-    protected RComplex doComplexVector(RComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) {
+    protected RComplex doComplexVector(RAbstractComplexVector operand, boolean naRm, @SuppressWarnings("unused") boolean finite) {
         RBaseNode.reportWork(this, operand.getLength());
         boolean profiledNaRm = naRmProfile.profile(naRm);
         RComplex result = RRuntime.double2complex(semantics.getDoubleStart());
@@ -348,7 +348,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     // "largest" String for the implementation of max function
 
     @Specialization(guards = {"supportString", "operand.getLength() == 0"})
-    protected String doStringVectorEmpty(@SuppressWarnings("unused") RStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) {
+    protected String doStringVectorEmpty(@SuppressWarnings("unused") RAbstractStringVector operand, @SuppressWarnings("unused") boolean naRm, @SuppressWarnings("unused") boolean finite) {
         if (semantics.getEmptyWarning() != null) {
             warning(semantics.emptyWarningCharacter);
         }
@@ -356,7 +356,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = {"supportString", "operand.getLength() == 1"})
-    protected String doStringVectorOneElem(RStringVector operand, boolean naRm, boolean finite) {
+    protected String doStringVectorOneElem(RAbstractStringVector operand, boolean naRm, boolean finite) {
         boolean profiledNaRm = naRmProfile.profile(naRm);
         String result = operand.getDataAt(0);
         if (profiledNaRm) {
@@ -369,7 +369,7 @@ public abstract class UnaryArithmeticReduceNode extends RBaseNode {
     }
 
     @Specialization(guards = {"supportString", "operand.getLength() > 1"})
-    protected String doStringVector(RStringVector operand, boolean naRm, boolean finite) {
+    protected String doStringVector(RAbstractStringVector operand, boolean naRm, boolean finite) {
         boolean profiledNaRm = naRmProfile.profile(naRm);
         na.enable(operand);
         int offset = 0;