Bug 416781 - reconcile compiler changes from BETA_JAVA8 with OT/J
- remove conflicting tagBits, replace by new virtual methods
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
index 57ad552..c04e382 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/SelectionEngine.java
@@ -70,7 +70,6 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.Dependencies;
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.ITranslationStates;
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.StateHelper;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.model.RoleModel;
 
 /**
@@ -842,7 +841,7 @@
 	private boolean isLocal(ReferenceBinding binding) {
 		if(binding instanceof ParameterizedTypeBinding) {
 //{ObjectTeams:
-			if (binding instanceof RoleTypeBinding)
+			if (binding.isRoleType())
 				return false; // prevents infinite recursion below:
 // SH}
 			return isLocal(((ParameterizedTypeBinding)binding).genericType());
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
index d894149..0460786 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Assignment.java
@@ -48,7 +48,6 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.Config;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lifting.Lowering;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.DependentTypeBinding;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.RoleTypeCreator;
 
 /**
@@ -265,7 +264,7 @@
 		}
 
 //{ObjectTeams: additional check and record team anchor equivalence:
-		if (Config.getLoweringPossible() && RoleTypeBinding.isRoleType(rhsType))
+		if (Config.getLoweringPossible() && rhsType.isRoleType())
 			((DependentTypeBinding)rhsType).recheckAmbiguousLowering(lhsType, this, scope, null);
 
 		VariableBinding lhsBinding = null;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
index a5a2a5c..3843d9c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/CastExpression.java
@@ -633,7 +633,7 @@
 				this.resolvedType = RoleTypeCreator.maybeWrapUnqualifiedRoleType(scope, this.resolvedType, this);
 			// check success:
 			if (   this.resolvedType == null
-				|| !RoleTypeBinding.isRoleType(this.resolvedType.leafComponentType()))
+				|| !this.resolvedType.leafComponentType().isRoleType())
 			{
 				// Although it is a role, wrapping failed. Error is already reported (hopefully).
 				assert scope.referenceCompilationUnit().compilationResult().hasErrors();
@@ -740,7 +740,7 @@
 private boolean shouldUnwrapExpressionType(TypeBinding expressionType) {
 	if (!this.isGenerated)
 		return false; // never unwrap for source statements
-	if (expressionType == null || !DependentTypeBinding.isDependentType(expressionType))
+	if (!(expressionType instanceof DependentTypeBinding))
 		return false; // never unwrap null nor non-RTB
 	if (this.requireRoleClass)
 		return true; // wrapping would falsely pretend compatibility
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
index ea98b4a..ffa19c7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
@@ -51,7 +51,6 @@
 import org.eclipse.jdt.internal.compiler.lookup.*;
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.Config;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.DependentTypeBinding;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.IAlienScopeTypeReference;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.RoleTypeCreator;
 
@@ -354,7 +353,7 @@
 						}
 					}
 //{ObjectTeams: additional re-check:
-					if (Config.getLoweringPossible() && RoleTypeBinding.isRoleType(initializationType))
+					if (Config.getLoweringPossible() && initializationType != null && initializationType.isRoleType())
 						((DependentTypeBinding)initializationType).recheckAmbiguousLowering(variableType, this, scope, null);
 // SH}
 				}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
index 20e90f8..18e069a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java
@@ -109,7 +109,6 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.ITranslationStates;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.AnchorMapping;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.DependentTypeBinding;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleBridgeMethodBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.WeakenedTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.mappings.CallinImplementorDyn;
@@ -602,7 +601,7 @@
 		} else if (constantPoolDeclaringClass.isInterface()) { // interface or annotation type
   :giro */
 		} else if (constantPoolDeclaringClass.isInterface()  // interface or annotation type
-				   || constantPoolDeclaringClass instanceof RoleTypeBinding)
+				   || constantPoolDeclaringClass.isRoleType())
 		{
 // SH}
 			codeStream.invoke(Opcodes.OPC_invokeinterface, codegenBinding, constantPoolDeclaringClass, this.typeArguments);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
index 9aeb9ec..ee5e343 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java
@@ -436,7 +436,7 @@
 		AnnotationBinding[] currentAnnotations = currentType.getAnnotations();
 		ITeamAnchor anchor = null;
 		int valParPos = -1;
-		if (DependentTypeBinding.isDependentType(currentType)) {
+		if (currentType instanceof DependentTypeBinding) {
 			anchor = ((DependentTypeBinding)currentType)._teamAnchor;
 			valParPos = ((DependentTypeBinding)currentType)._valueParamPosition;
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
index 423548b..6ef56b1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java
@@ -65,6 +65,7 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticOTMethodBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleFieldAccess;
+import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.WeakenedTypeBinding;
 
 /**
  * OTDT changes:
@@ -7491,10 +7492,11 @@
 	 * 	   constantPool.literalIndexForType(aTypeBinding)
 	 */
 	int idx = this.constantPool.literalIndexForType(aTypeBinding);
-	if (aTypeBinding instanceof RoleTypeBinding) {
+	if (RoleTypeBinding.isRoleWithExplicitAnchor(aTypeBinding)) {
+		if (aTypeBinding instanceof WeakenedTypeBinding)
+			aTypeBinding = ((WeakenedTypeBinding) aTypeBinding).getStrongType();
 		RoleTypeBinding role = (RoleTypeBinding)aTypeBinding;
-		if (role.hasExplicitAnchor())
-			this.classFile.referenceBinding.model.addTypeAnchor(role._teamAnchor, idx);
+		this.classFile.referenceBinding.model.addTypeAnchor(role._teamAnchor, idx);
 	}
 	return idx;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
index b8c6309..f19f35f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
@@ -1752,7 +1752,7 @@
 			if (baseclass != null) { // is null if a cycle was detected
 
 				if (   baseclass.isRole()
-					&& !(baseclass instanceof RoleTypeBinding))
+					&& !baseclass.isRoleType())
 				{
 					if (RoleModel.isRoleFromOuterEnclosing(sourceType, baseclass)) {
 						TeamModel outerTeam = baseclass.enclosingType().getTeamModel();
@@ -2363,7 +2363,7 @@
 			this.superTypeReference = typeReference;
 			ReferenceBinding superType = (ReferenceBinding) typeReference.resolveSuperType(this);
 //{ObjectTeams:	anchor.R is not allowed in this position
-			if (superType instanceof RoleTypeBinding)
+			if (superType != null && superType.isRoleType())
 			{
 				RoleTypeBinding superRole = (RoleTypeBinding)superType;
 				if (superRole.hasExplicitAnchor()) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
index bdc1329..2a7f6c7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding.java
@@ -173,7 +173,7 @@
 							// TODO: could this be integrated with TypeVariableBinding.boundCheck(Substitution, TypeBinding, ReferenceBinding, Scope)
 							//        which already uses Substitutation.substituteAnchore(ITeamAnchor,int) internally? 
 							for (int i = 0; i < solutions.length; i++) {
-								if (DependentTypeBinding.isDependentType(solutions[i])
+								if (solutions[i] instanceof DependentTypeBinding
 										&& typeVariables[i].anchors != null
 										&& !AnchorMapping.isLegalInstantiation(typeVariables[i], (DependentTypeBinding) solutions[i]))
 									return null; // illegal due to mismatching team anchors
@@ -826,7 +826,7 @@
 	}
 	public ITeamAnchor substituteAnchor(ITeamAnchor anchor, int rank) {
 		TypeBinding typeArgument = this.typeArguments[rank];
-		if (DependentTypeBinding.isDependentType(typeArgument))
+		if (typeArgument instanceof DependentTypeBinding)
 			return ((DependentTypeBinding)typeArgument)._teamAnchor;
 		return null;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
index 2f130c5..cb4c0ab 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java
@@ -841,7 +841,7 @@
 	// for mixed type and value parameters:
 	@Override
 	public DependentTypeBinding asPlainDependentType() {
-		if (DependentTypeBinding.isPlainDependentType(this.type))
+		if (this.type != null && this.type.isPlainDependentType())
 			return (DependentTypeBinding) this.type;
 		return null;
 	}
@@ -1145,7 +1145,7 @@
 	}
 	// hook for dependent type printing:
 	public boolean appendReadableValueParameterNames(StringBuffer buf) {
-		if (DependentTypeBinding.isDependentType(this.type))
+		if (this.type instanceof DependentTypeBinding)
 			return ((DependentTypeBinding)this.type).appendReadableValueParameterNames(buf);
 		return false;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
index 8a95f615..f4109c5 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
@@ -53,7 +53,6 @@
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.Dependencies;
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.ITranslationStates;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.AbstractOTReferenceBinding;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.model.TypeModel;
 import org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.transformer.RoleSplitter;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.TSuperHelper;
@@ -92,7 +91,6 @@
  * Note: now sourceName and sourceName() have different semantics.
  *
  */
-@SuppressWarnings({"rawtypes", "unchecked"})
 //{ObjectTeams: changed superclass in order to separate out OT features:
 abstract public class ReferenceBinding extends AbstractOTReferenceBinding {
 	protected ReferenceBinding _this() { return this; } // used in AbstractOTReferenceBinding to refer to 'this'
@@ -1403,7 +1401,7 @@
 //{ObjectTeams: support asymmetric comparison. // FIXME(SH): is this needed or is super-impl smart enough??
 @Override
 public boolean isProvablyDistinct(TypeBinding otherType) {
-	if (RoleTypeBinding.isRoleType(otherType))
+	if (otherType.isRoleType())
 		return otherType.isProvablyDistinct(this);
 	else
 		return super.isProvablyDistinct(otherType);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
index 0200747..116e0ed 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/Scope.java
@@ -570,7 +570,7 @@
 					}
 					if (substitutedArguments != originalArguments || substitutedEnclosing != originalEnclosing) { //$IDENTITY-COMPARISON$
 //{ObjectTeams: combination role & parameterized:
-						if (RoleTypeBinding.isRoleType(originalParameterizedType)) {
+						if (originalParameterizedType.isRoleType()) {
 							DependentTypeBinding originalRole = (DependentTypeBinding) originalParameterizedType;
 							return originalParameterizedType.environment.createParameterizedType(
 								originalParameterizedType.genericType(), substitutedArguments, originalRole._teamAnchor, originalRole._valueParamPosition, substitutedEnclosing, Binding.NO_ANNOTATIONS);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
index 7af8c0c..9d37ab4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TagBits.java
@@ -199,12 +199,6 @@
 	// set when type binding has a captured wildcard somewhere
 	long HasCapturedWildcard = ASTNode.Bit62L;
 //{ObjectTeams:
-
-	// is it a wrapped role type?
-    long IsWrappedRole = ASTNode.Bit62L;					// for role type bindings
-    
-    // is it a dependent type?
-    long IsDependentType = ASTNode.Bit63L;					// for type bindings
     // is a _OT$base field faked to compensate for weakening?
     long IsFakedField = ASTNode.Bit63L;						// for field binding
     // have types been wrapped in the signature
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
index 6b53265..b45bd05 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeBinding.java
@@ -685,6 +685,12 @@
 public boolean isRole() {
 	return false;
 }
+public boolean isRoleType() {
+	return false;
+}
+public boolean isPlainDependentType() {
+	return false;
+}
 // SH}
 
 /**
@@ -914,7 +920,7 @@
 //{ObjectTeams: relax if at least one type is a dependent type binding:
 boolean distinctRealTypes(TypeBinding one, TypeBinding two) {
 	if (one instanceof ReferenceBinding && two instanceof ReferenceBinding)
-		if (DependentTypeBinding.isDependentType(one) || DependentTypeBinding.isDependentType(two))
+		if (one instanceof DependentTypeBinding || two instanceof DependentTypeBinding)
 			return notEquals(((ReferenceBinding)one).getRealType(), ((ReferenceBinding)two).getRealType());
 	return TypeBinding.notEquals(one, two);
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
index faab619..fd8342c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
@@ -441,10 +441,10 @@
 		if (   valueParamPosition > -1 							// position specified, requires dependent type
 		    && !(cachedType instanceof DependentTypeBinding))
 			return false;
-		if (   (cachedType instanceof DependentTypeBinding)		// dependent type specified, positions must match
+		if (   (cachedType instanceof DependentTypeBinding)	// dependent type specified, positions must match
 		    && ((DependentTypeBinding)cachedType)._valueParamPosition != valueParamPosition)
 			return false;
-		if (teamAnchor == null && RoleTypeBinding.isRoleType(cachedType)) // role type found though not requested?
+		if (teamAnchor == null && cachedType.isRoleType()) 		// role type found though not requested?
 			return false;
 		return true;
 	}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
index ae52d98..dea47fd 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding.java
@@ -239,7 +239,7 @@
 		if (this.anchors != null) {
 			ITeamAnchor anchor = substitution.substituteAnchor(this.anchors[0], 0); // TODO(SH): support multiple anchors 
 			if (anchor != null) {
-				if (!DependentTypeBinding.isDependentType(argumentType)) {
+				if (!(argumentType instanceof DependentTypeBinding)) {
 					return TypeConstants.MISMATCH;
 				} else {
 					ITeamAnchor argAnchor = ((DependentTypeBinding)argumentType).getAnchor();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index ff0aed7..aadded1 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -8441,8 +8441,8 @@
 	}
 //{ObjectTeams: differentiate for role types:
 	int problemId = expectingLocation instanceof ReturnStatement ? IProblem.ReturnTypeMismatch : IProblem.TypeMismatch; // default
-	if (   RoleTypeBinding.isRoleType(expectedType)
-		&& RoleTypeBinding.isRoleType(actualType))
+	if (   expectedType.isRoleType()
+		&& actualType != null && actualType.isRoleType())
 	{
 		DependentTypeBinding resultRole = (DependentTypeBinding)actualType;
 		DependentTypeBinding expectedRole = (DependentTypeBinding)expectedType;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
index d6720ef..6feaa7e 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
@@ -482,7 +482,7 @@
 				roleReturnLeaf = RoleModel.getTopmostBoundRole(this.scope, (ReferenceBinding)roleReturnLeaf);
 
 			// need the RTB:
-			if (!DependentTypeBinding.isDependentType(roleReturnLeaf))
+			if (!(roleReturnLeaf instanceof DependentTypeBinding))
 				roleReturnLeaf = RoleTypeCreator.maybeWrapUnqualifiedRoleType(roleReturnLeaf,this.scope.enclosingSourceType());
 
 			// array?
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/FieldAccessSpec.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/FieldAccessSpec.java
index 2e13ad3..4e79132 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/FieldAccessSpec.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/FieldAccessSpec.java
@@ -217,7 +217,7 @@
 	 *  Create a faked method binding representing the access method to be generated by OTRE.
 	 */
 	private MethodBinding createMethod(ReferenceBinding baseType, char[] accessorSelector) {
-		if (baseType instanceof RoleTypeBinding)
+		if (baseType.isRoleType())
 			baseType = baseType.getRealClass();
     	if (this.calloutModifier == TerminalTokens.TokenNameget) {
     		// Use the actual field type rather than the expected type (role view)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialTranslationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialTranslationExpression.java
index d2d3594..9e200c9 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialTranslationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialTranslationExpression.java
@@ -37,7 +37,6 @@
 import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
 import org.eclipse.objectteams.otdt.internal.core.compiler.control.Config;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 
 /**
  * NEW for OTDT.
@@ -136,8 +135,8 @@
 	}
 
 	private boolean areTypesCompatible(TypeBinding thisType, TypeBinding thatType) {
-	    if (    RoleTypeBinding.isRoleType(thisType)
-	         && RoleTypeBinding.isRoleType(thatType))
+	    if (    thisType.isRoleType()
+	         && thatType.isRoleType())
 	    {
 	        // ignore anchors for now:
 	    	thisType = ((ReferenceBinding)thisType).getRealClass();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/AnchorListAttribute.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/AnchorListAttribute.java
index 0a06d43..3302155 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/AnchorListAttribute.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/AnchorListAttribute.java
@@ -103,7 +103,7 @@
     private void writeElement(TypeBinding type) {
         if (type.isArrayType())
             type = type.leafComponentType();
-        if (DependentTypeBinding.isDependentType(type)) {
+        if (type instanceof DependentTypeBinding) {
             DependentTypeBinding roleType = (DependentTypeBinding)type;
             ITeamAnchor anchor = roleType._teamAnchor;
             if (anchor instanceof TThisBinding)
@@ -253,7 +253,7 @@
         if (binding.isBaseType())
             return false;
         ReferenceBinding refBinding = (ReferenceBinding)binding;
-        if (!DependentTypeBinding.isDependentType(refBinding))
+        if (!(refBinding instanceof DependentTypeBinding))
             return false;
         ITeamAnchor anchor = ((DependentTypeBinding)refBinding)._teamAnchor;
         return !(anchor instanceof TThisBinding);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/ConstantPoolObjectMapper.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/ConstantPoolObjectMapper.java
index 72ac638..8cff758 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/ConstantPoolObjectMapper.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/ConstantPoolObjectMapper.java
@@ -100,9 +100,7 @@
 			declaringClass = src_cpo.getFieldRef().declaringClass;
 			break;
 		}
-		if (   declaringClass != null
-			&& declaringClass instanceof RoleTypeBinding
-			&& ((RoleTypeBinding)declaringClass).hasExplicitAnchor())
+		if (RoleTypeBinding.isRoleWithExplicitAnchor(declaringClass))
 		{
 			return src_cpo; // don't map features of externalized roles!
 		}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/OTSpecialAccessAttribute.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/OTSpecialAccessAttribute.java
index 0499c44..ba800da 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/OTSpecialAccessAttribute.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/OTSpecialAccessAttribute.java
@@ -359,7 +359,7 @@
 						continue;  // current role is not relevant (not bound)
 					if (!CharOperation.equals(newBase.sourceName(), oldBase.sourceName()))
 						continue;  // current role is bound to a different base
-					if (RoleTypeBinding.isRoleType(newBase)) {
+					if (newBase.isRoleType()) {
 						if (newBase instanceof WeakenedTypeBinding)
 							newBase = ((WeakenedTypeBinding)newBase).getStrongType();
 						if (((RoleTypeBinding)newBase)._teamAnchor.isBaseAnchor()) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/StaticReplaceBindingsAttribute.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/StaticReplaceBindingsAttribute.java
index cae095b..b6dd79b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/StaticReplaceBindingsAttribute.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/StaticReplaceBindingsAttribute.java
@@ -192,7 +192,7 @@
 		ReferenceBinding baseClass = null;
 		if (roleClass != null)
 			baseClass = roleClass.baseclass();
-		if (baseClass != null && RoleTypeBinding.isRoleType(baseClass))
+		if (baseClass != null && baseClass.isRoleType())
 			baseClass = ((RoleTypeBinding)baseClass).getRealClass();
 		this._size += 10; // 5 names: 1 roleclass, 2 selectors, 2 signatures
 		Mapping currentMapping = new Mapping(
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/AnchorMapping.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/AnchorMapping.java
index f5ef6d7..d344677 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/AnchorMapping.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/AnchorMapping.java
@@ -378,8 +378,9 @@
 						scope.problemReporter().externalizingNonPublicRole(arguments[i], roleType);
 						success = false;
 					}
-				} else if (   loweringPossible 										 // if we detected lowering possible before, recheck here
-						   && RoleTypeBinding.isRoleType(arguments[i].resolvedType)) 
+				} else if (   loweringPossible 							// if we detected lowering possible before, recheck here
+							&& arguments[i].resolvedType != null
+						    && arguments[i].resolvedType.isRoleType()) 
 				{
 					((DependentTypeBinding)arguments[i].resolvedType).recheckAmbiguousLowering(parameters[i], arguments[i], scope, messageSend.binding);
 				}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/DependentTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/DependentTypeBinding.java
index 59de08a..53dd661 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/DependentTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/DependentTypeBinding.java
@@ -105,7 +105,7 @@
 	private void initializeFromType(ReferenceBinding givenType) {
 		this.model = givenType.model; // shared model from type.
 		this.modifiers      = givenType.modifiers;
-		this.tagBits        = givenType.tagBits | TagBits.IsDependentType;
+		this.tagBits        = givenType.tagBits;
 		this.tagBits 		&= ~(TagBits.AreMethodsSorted|TagBits.AreMethodsComplete); // in case the generic type was already processed
 		
 		this.compoundName     	= givenType.compoundName;
@@ -262,34 +262,29 @@
 			return true; // could be anchored type variable
 		return binding.valueParamSynthArgs() != NO_SYNTH_ARGUMENTS;
 	}
-    public static boolean isDependentType(TypeBinding binding) {
-    	if (binding == null) return false;
-    	return (binding.tagBits & TagBits.IsDependentType) != 0;
-    }
 
-    public static boolean isPlainDependentType(TypeBinding binding) {
-    	if (binding == null) return false;
-    	return (binding.tagBits & (TagBits.IsDependentType|TagBits.IsWrappedRole)) == TagBits.IsDependentType;
-	}
     @Override
     public DependentTypeBinding asPlainDependentType() {
-    	if ((this.tagBits & (TagBits.IsWrappedRole)) == 0)
-    		return this;
-    	return null;
+    	return this;
     }
     
+    @Override
+    public boolean isPlainDependentType() {
+    	return true;
+    }
+
     /**
      * Is type a dependent type and declaredAnchor the field representing its type value parameter?
      */
     public static boolean isDependentTypeOf(TypeBinding type, ITeamAnchor declaredAnchor) {
-    	if (!isPlainDependentType(type))
+    	if (type == null || !type.isPlainDependentType())
     		return false;
     	DependentTypeBinding depType = (DependentTypeBinding)type;
     	return depType._matchingVariable == declaredAnchor;
     }
 
 	public static boolean isDependentTypeVariable(TypeBinding binding) {
-		if ((binding.tagBits & (TagBits.IsDependentType|TagBits.IsWrappedRole)) == 0)
+		if (!(binding instanceof DependentTypeBinding))
 			return false;
 		return ((DependentTypeBinding)binding).type.kind() == TYPE_PARAMETER;
 	}
@@ -316,7 +311,7 @@
 
 	@Override
 	public boolean isProvablyDistinct(TypeBinding otherType) {
-		if (DependentTypeBinding.isDependentType(otherType))
+		if (otherType instanceof DependentTypeBinding)
 			otherType = ((DependentTypeBinding)otherType).getRealType();
 			// for internal casting purposes type anchors can be ignored:
 		return getRealType().isProvablyDistinct(otherType);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/RoleTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/RoleTypeBinding.java
index 8ea6269..7289081 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/RoleTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/RoleTypeBinding.java
@@ -166,8 +166,6 @@
 
     	initializeDependentType(teamAnchor, -1); // role type bindings have no explicit value parameters
 
-        this.tagBits |= TagBits.IsWrappedRole;
-
         // infer argument position.
         ITeamAnchor firstAnchorSegment = teamAnchor.getBestNamePath()[0];
         if (   firstAnchorSegment instanceof LocalVariableBinding
@@ -311,11 +309,11 @@
 		DependentTypeBinding leftDep= null;
 		DependentTypeBinding rightDep= null;
 		// nesting occurs for WeakenedTypeBinding(RoleTypeBinding), e.g.
-		while (DependentTypeBinding.isDependentType(left)) {
+		while (left instanceof DependentTypeBinding) {
 			leftDep= (DependentTypeBinding)left;
 			left= leftDep.type;
 		}
-		while (DependentTypeBinding.isDependentType(right)) {
+		while (right instanceof DependentTypeBinding) {
 			rightDep= (DependentTypeBinding)right;
 			right= rightDep.type;
 		}
@@ -324,9 +322,14 @@
 			&& CharOperation.equals(left.internalName(), right.internalName());
     }
 
-    public static boolean isRoleType(TypeBinding binding) {
-    	if (binding == null) return false;
-    	return (binding.tagBits & TagBits.IsWrappedRole) != 0;
+    @Override
+    public boolean isRoleType() {
+    	return true;
+    }
+    
+    @Override
+    public boolean isPlainDependentType() {
+    	return false;
     }
 
     public static boolean isRoleTypeOrArrayOfRole(TypeBinding binding) {
@@ -340,7 +343,8 @@
 //				if (isRoleTypeOrArrayOfRole(typeArg)) return true;
 //			return false;
 //    	}
-    	return (binding.leafComponentType().tagBits & TagBits.IsWrappedRole) != 0;
+    	TypeBinding leafType = binding.leafComponentType();
+		return leafType != null && leafType.isRoleType();
     }
 
 	/**
@@ -352,7 +356,7 @@
 	public static boolean isRoleWithExplicitAnchor(TypeBinding type) {
 		if (type == null)
 			return false;
-		if ((type.tagBits & TagBits.IsWrappedRole) == 0)
+		if (!type.isRoleType())
 			return false;
 		return ((DependentTypeBinding)type).hasExplicitAnchor();
 	}
@@ -366,10 +370,15 @@
 	public static boolean isRoleWithoutExplicitAnchor(TypeBinding type) {
 		if (type == null)
 			return false;
-		if ((type.tagBits & TagBits.IsWrappedRole) == 0)
+		if (!type.isRoleType())
 			return false;
 		return !((DependentTypeBinding)type).hasExplicitAnchor();
 	}
+	
+	@Override
+	public DependentTypeBinding asPlainDependentType() {
+		return null;
+	}
 
 	/**
 	 * Answer whether the method has a parameter of a type of a role such that
@@ -771,7 +780,7 @@
         	return true;
 
         ReferenceBinding referenceBinding = (ReferenceBinding) right;
-        if (isRoleType(referenceBinding))
+        if (referenceBinding.isRoleType())
         {
         	RoleTypeBinding rightRole = getRoleTypeBinding(referenceBinding);
         	ReferenceBinding rightTeam = referenceBinding.enclosingType();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/TeamAnchor.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/TeamAnchor.java
index b3acabd..2872892 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/TeamAnchor.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/TeamAnchor.java
@@ -291,7 +291,7 @@
 		if (bind != null && (bind instanceof TeamAnchor))
 			return (TeamAnchor)bind;
 		TypeBinding type = expression.resolvedType;
-		if (RoleTypeBinding.isRoleType(type))
+		if (type != null && type.isRoleType())
 			return ((IRoleTypeBinding)type).getAnchor();
 		else
 			return null;
@@ -409,9 +409,10 @@
 	public ITeamAnchor retrieveAnchorFromAnchorRoleTypeFor(ReferenceBinding roleType) {
 		// TODO (SH) copied and not yet validated!
 		// in contrast to the above, this method will never return 'this'
-	    if ((this.type != null) && RoleTypeBinding.isRoleType(leafType()))
+	    ReferenceBinding leafType = leafType();
+		if (this.type != null && leafType != null && leafType.isRoleType())
 	    {
-	        ITeamAnchor anchor = ((IRoleTypeBinding)leafType()).getAnchor();
+	        ITeamAnchor anchor = ((IRoleTypeBinding)leafType).getAnchor();
 	        if (anchor.isTeamContainingRole(roleType))
 	        {
 	            return anchor;
@@ -746,7 +747,7 @@
     			if (strongRoleType != null)
     				return WeakenedTypeBinding.makeWeakenedTypeBinding(strongRoleType, roleBinding, dimensions);
     		}
-    		if (dimensions == roleBinding.dimensions() && DependentTypeBinding.isDependentType(roleBinding))
+    		if (dimensions == roleBinding.dimensions() && roleBinding instanceof DependentTypeBinding)
     			return roleBinding;
     	}
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/WeakenedTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/WeakenedTypeBinding.java
index ebb87c3..d66ba80 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/WeakenedTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lookup/WeakenedTypeBinding.java
@@ -122,6 +122,11 @@
 		return (DependentTypeBinding) this.type; // cast is safe by construction in constructor
 	}
 
+	@Override
+	public DependentTypeBinding asPlainDependentType() {
+		return this.type.asPlainDependentType();
+	}
+
 	public static ReferenceBinding getBytecodeType(TypeBinding returnType) {
 		if (returnType instanceof WeakenedTypeBinding)
 			// recursivly unpack all contained WTB, too:
@@ -133,6 +138,16 @@
 		return TypeBinding.notEquals(this.weakenedType, this.type.getRealType());
 	}
 	
+	@Override
+	public boolean isRoleType() {
+		return this.type.isRoleType();
+	}
+	
+	@Override
+	public boolean isPlainDependentType() {
+		return this.type.isPlainDependentType();
+	}
+	
 	/**
      * Weakening implies that the interfaces are used to ensure compatibility,
      * so never use the signature of a class part.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementor.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementor.java
index 7462cf7..406d2b2 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementor.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementor.java
@@ -952,7 +952,7 @@
 		TypeVariableBinding[] arguments = null;
 		if (givenType.isParameterizedType())
 			arguments = ((ParameterizedTypeBinding)givenType).typeVariables();
-		if (DependentTypeBinding.isDependentType(baseBinding)) {
+		if (baseBinding instanceof DependentTypeBinding) {
 			ITeamAnchor anchor = ((DependentTypeBinding)baseBinding).getAnchor();
 			if (anchor.isTeamContainingRole(givenLeaf)) {
 				if (TypeBinding.notEquals(anchor.getResolvedType(), givenLeaf.enclosingType()))
@@ -1098,7 +1098,7 @@
 
 		// return type adjustments:
 		TypeBinding expectedType= roleMethodSpec.resolvedType();
-		if (DependentTypeBinding.isDependentType(expectedType)) {
+		if (expectedType instanceof DependentTypeBinding) {
 			DependentTypeBinding roleBinding = (DependentTypeBinding)expectedType;
 			if (roleBinding.getAnchor() instanceof TThisBinding)
 				expectedType= roleBinding.baseclass();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementorDyn.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementorDyn.java
index 79eea38..c4ecf8b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementorDyn.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CalloutImplementorDyn.java
@@ -26,7 +26,6 @@
 import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.FieldAccessSpec;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.MethodSpec;
-import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.RoleTypeBinding;
 import org.eclipse.objectteams.otdt.internal.core.compiler.model.RoleModel;
 import org.eclipse.objectteams.otdt.internal.core.compiler.model.TeamModel;
 import org.eclipse.objectteams.otdt.internal.core.compiler.util.AstGenerator;
@@ -68,7 +67,7 @@
 	}
 
 	private static char[] ensureAccessor(Scope scope, ReferenceBinding baseType, boolean isStatic) {
-		if (baseType instanceof RoleTypeBinding)
+		if (baseType.isRoleType())
 			baseType = baseType.getRealClass();
 		char[] selector = isStatic ? ACCESS_STATIC : ACCESS;
 		MethodBinding[] methods = baseType.getMethods(selector);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/copyinheritance/CopyInheritance.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/copyinheritance/CopyInheritance.java
index f7c6a52..2ea5570 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/copyinheritance/CopyInheritance.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/copyinheritance/CopyInheritance.java
@@ -2144,7 +2144,7 @@
 
 
         // true weakening (with weakened type binding) avoids bridge methods
-        if (TypeBinding.notEquals(method.binding.returnType, template.returnType) && DependentTypeBinding.isDependentType(method.binding.returnType))
+        if (TypeBinding.notEquals(method.binding.returnType, template.returnType) && method.binding.returnType instanceof DependentTypeBinding)
         	method.binding.returnType = WeakenedTypeBinding.makeWeakenedTypeBinding((DependentTypeBinding)method.binding.returnType.leafComponentType(),
         																	   	    (ReferenceBinding) template.returnType.leafComponentType(),
         																	   	    template.returnType.dimensions());
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
index a929333..42f482c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
@@ -185,7 +185,7 @@
         if (   (variableBinding instanceof LocalVariableBinding) // note that for FieldBinding Bit63L has a different meaning!
 			&& (((LocalVariableBinding)variableBinding).tagBits & TagBits.IsFreshTeamInstance) != 0) 
         {
-        	if (!RoleTypeBinding.isRoleType(refBinding))
+        	if (!refBinding.isRoleType())
         		return variableBinding.getDependentTypeBinding(refBinding, -1, null, dimensions);
         	return 
         		originalType;
@@ -263,7 +263,7 @@
 		ReferenceBinding refReturn = (ReferenceBinding)returnType.leafComponentType();
 
 		// don't try externalized non-public role if compatibility can be established with plain types:
-        if (send.expectedType != null && !DependentTypeBinding.isDependentType(send.expectedType))
+        if (send.expectedType != null && !(send.expectedType instanceof DependentTypeBinding))
         	if (   refReturn.isRole()
         		&& !refReturn.isPublic()
         		&& returnType.isCompatibleWith(send.expectedType))
@@ -910,7 +910,7 @@
 		    		anchorBinding = ((RoleTypeBinding)receiverLeaf)._teamAnchor;
 		    	} else {
 		    		// regression fix during work on https://bugs.eclipse.org/331877
-		    		if (RoleTypeBinding.isRoleType(anchorExpr.resolvedType))
+		    		if (anchorExpr.resolvedType != null && anchorExpr.resolvedType.isRoleType())
 		    			return ((DependentTypeBinding)anchorExpr.resolvedType)._teamAnchor;
 		    		return cannotWrapType(roleType, problemReporter, typedNode);
 		    	}
@@ -974,7 +974,7 @@
 	    ProblemReporter  problemReporter,
 	    ASTNode          typedNode)
 	{
-	    if (   !RoleTypeBinding.isRoleType(roleType)
+	    if (   !roleType.isRoleType()
 	        && problemReporter != null)
 	    {
 	    	if ((typedNode.bits & ASTNode.IsGeneratedWithProblem) == 0) {
@@ -1257,7 +1257,7 @@
 						problemReason);
 	   	}
 
-	    if (DependentTypeBinding.isDependentType(roleBinding))
+	    if (roleBinding instanceof DependentTypeBinding)
 	    {
 	        DependentTypeBinding wrappedRole = (DependentTypeBinding)roleBinding;
 	        if (wrappedRole._teamAnchor != variableBinding)
@@ -1363,7 +1363,7 @@
 	    		scope.problemReporter().invalidType(type, anchoredType);
 	    		return null;
 	    	}
-	    	if (RoleTypeBinding.isRoleType(anchoredType.leafComponentType())) {
+	    	if (anchoredType.leafComponentType().isRoleType()) {
 		    	// prepare for creating an AnchorListAttribute
 		        RoleTypeBinding leafRoleType = (RoleTypeBinding)anchoredType.leafComponentType();
 				leafRoleType._argumentPosition = argPos;
@@ -1656,7 +1656,7 @@
 		   }
 	   }
 
-       if (DependentTypeBinding.isDependentType(type)) {
+       if (type instanceof DependentTypeBinding) {
     	   TypeBinding substituted = substitution.substitute((DependentTypeBinding) type, typeArguments, dimensions); 
            if (substituted != type) // includes substituted == null //$IDENTITY-COMPARISON$
         	   return substituted;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/TypeAnalyzer.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/TypeAnalyzer.java
index ad61473..3389fae 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/TypeAnalyzer.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/TypeAnalyzer.java
@@ -235,7 +235,7 @@
         // guaranteed to be scalar now
         if (currentType instanceof ReferenceBinding)
         {
-            if (DependentTypeBinding.isDependentType(currentType))
+            if (currentType instanceof DependentTypeBinding)
                 currentType = ((DependentTypeBinding)currentType).getRealType();
             if (! (tsuperType instanceof ReferenceBinding))
                 return false;
@@ -360,7 +360,7 @@
     		tb = ((UnresolvedReferenceBinding)tb).resolve(env, false);
     	}
         if (   createTeamAnchor
-        	&& DependentTypeBinding.isDependentType(tb)
+        	&& tb instanceof DependentTypeBinding
            	&& ((DependentTypeBinding)tb).hasExplicitAnchor())
         {
         	DependentTypeBinding roleTypeBinding = (DependentTypeBinding)tb;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
index e09f7fb..3cd217e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/RecoveredTypeBinding.java
@@ -780,7 +780,7 @@
 		if (this.binding != null) {
 			if (onlyRelevant)
 				return RoleTypeBinding.isRoleWithExplicitAnchor(this.binding);
-			return DependentTypeBinding.isDependentType(this.binding);
+			return this.binding instanceof DependentTypeBinding;
 		}
 		if (   this.currentType != null
 			&& this.currentType.isParameterizedType())
@@ -791,7 +791,7 @@
 	/* implement method from ITypeBinding. */
 	public String[] getAnchorPath() {
 		if (this.binding != null) {
-			if (DependentTypeBinding.isDependentType(this.binding))
+			if (this.binding instanceof DependentTypeBinding)
 				return TypeBinding.getBestNamePath((DependentTypeBinding)this.binding);
 		} else if (    this.currentType != null
 			        && this.currentType.isParameterizedType()
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
index 5d9b1cc..5af26e6 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
@@ -1485,11 +1485,11 @@
 	public boolean isDependentType(boolean onlyRelevant) {
 		if (onlyRelevant)
 			return RoleTypeBinding.isRoleWithExplicitAnchor(this.binding);
-		return DependentTypeBinding.isDependentType(this.binding);
+		return this.binding instanceof DependentTypeBinding;
 	}
 
 	public String[] getAnchorPath() {
-		if (!DependentTypeBinding.isDependentType(this.binding))
+		if (!(this.binding instanceof DependentTypeBinding))
 			return new String[0];
 
 		return getBestNamePath((DependentTypeBinding)this.binding);