anchor.diff:    
     visitIntegerLiteral(IntegerLiteral n) {
       super.visitIntegerLiteral(n);
  -    constraints.add(new EqualityConstraint(new TypeVariable(n), new ConcreteType("int")));
  +    constraints.add(new EqualityConstraint(new TypeVariable(n), new NominalType("int")));
     }
     
     visitDoubleLiteral(DoubleLiteral n) {
       super.visitDoubleLiteral(n);
  -    constraints.add(new EqualityConstraint(new TypeVariable(n), new ConcreteType("double")));
  +    constraints.add(new EqualityConstraint(new TypeVariable(n), new NominalType("double")));
     }
     
     visitBinaryExpression(BinaryExpression be) {
  
positive.code: }
  
  class Substitutions {
    Map<TypeVariable, AbstractType> substitutions = <TypeVariable, AbstractType>{};
    
    AbstractType operator [](TypeVariable key) => substitutions[key];
    void operator []=(TypeVariable key, AbstractType type) {
      if (substitutions.containsKey(key))
        substitutions[key] = substitutions[key].union(type);
  
negative.code:       substitutions[node.rightHandSide] = node.leftHandSide;
        queue.replace(node.rightHandSide, substitutions[node.rightHandSide]); 
        substitutions.replace(node.rightHandSide, substitutions[node.rightHandSide]);
        
        //If none of the sides where type variables just union the new element.
      } else if (node.leftHandSide is ObjectType) {
        node.leftHandSide.union(node.rightHandSide);
      } else if (node.rightHandSide is ObjectType) {
  