diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
index 2f8ff1c..364f3a1 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
@@ -79,8 +79,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classAnnotatedByClassName
    *   <li>classAnnotatedByClassConstant
    *   <li>classAnnotatedByClassNamePattern
@@ -152,8 +150,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -175,8 +171,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -195,8 +189,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -218,8 +210,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -230,56 +220,6 @@
   Class<?> instanceOfClassConstantExclusive() default Object.class;
 
   /**
-   * Define the instance-of pattern as classes extending the fully qualified class name.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassConstant
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class name that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassName} instead.
-   */
-  @Deprecated
-  String extendsClassName() default "";
-
-  /**
-   * Define the instance-of pattern as classes extending the referenced Class constant.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class constant that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassConstant} instead.
-   */
-  @Deprecated
-  Class<?> extendsClassConstant() default Object.class;
-
-  /**
    * Define the class-annotated-by pattern by fully qualified class name.
    *
    * <p>Mutually exclusive with the following other properties defining class-annotated-by:
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
index 4a39ca8..3a96660 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
@@ -41,8 +41,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classAnnotatedByClassName
    *   <li>classAnnotatedByClassConstant
    *   <li>classAnnotatedByClassNamePattern
@@ -114,8 +112,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -137,8 +133,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -157,8 +151,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -180,8 +172,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -192,56 +182,6 @@
   Class<?> instanceOfClassConstantExclusive() default Object.class;
 
   /**
-   * Define the instance-of pattern as classes extending the fully qualified class name.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassConstant
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class name that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassName} instead.
-   */
-  @Deprecated
-  String extendsClassName() default "";
-
-  /**
-   * Define the instance-of pattern as classes extending the referenced Class constant.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class constant that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassConstant} instead.
-   */
-  @Deprecated
-  Class<?> extendsClassConstant() default Object.class;
-
-  /**
    * Define the class-annotated-by pattern by fully qualified class name.
    *
    * <p>Mutually exclusive with the following other properties defining class-annotated-by:
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
index 3d055d0..bf9251b 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
@@ -61,26 +61,35 @@
    *
    * <p>The specified constraints must remain valid for the target.
    *
-   * <p>The default constraints depend on the type of the target.
+   * <p>The default constraints depend on the kind of the target. For all targets the default
+   * constraints include:
    *
    * <ul>
-   *   <li>For classes, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#CLASS_INSTANTIATE}}
-   *   <li>For methods, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#METHOD_INVOKE}}
-   *   <li>For fields, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#FIELD_GET}, {@link KeepConstraint#FIELD_SET}}
+   *   <li>{@link KeepConstraint#LOOKUP}
+   *   <li>{@link KeepConstraint#NAME}
+   *   <li>{@link KeepConstraint#VISIBILITY_RELAX}
    * </ul>
    *
-   * <p>Mutually exclusive with the following other properties defining constraints:
+   * <p>For classes the default constraints also include:
    *
    * <ul>
-   *   <li>constraintAdditions
-   *   <li>allow
-   *   <li>disallow
+   *   <li>{@link KeepConstraint#CLASS_INSTANTIATE}
    * </ul>
    *
-   * <p>If nothing is specified for constraints the default is the default for {@link #constraints}.
+   * <p>For methods the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#METHOD_INVOKE}
+   * </ul>
+   *
+   * <p>For fields the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#FIELD_GET}
+   *   <li>{@link KeepConstraint#FIELD_SET}
+   * </ul>
+   *
+   * <p>Mutually exclusive with the property `constraintAdditions` also defining constraints.
    *
    * @return Usage constraints for the target.
    */
@@ -94,63 +103,13 @@
    *
    * <p>The default constraints are documented in {@link #constraints}
    *
-   * <p>Mutually exclusive with the following other properties defining constraints:
-   *
-   * <ul>
-   *   <li>constraints
-   *   <li>allow
-   *   <li>disallow
-   * </ul>
-   *
-   * <p>If nothing is specified for constraints the default is the default for {@link #constraints}.
+   * <p>Mutually exclusive with the property `constraints` also defining constraints.
    *
    * @return Additional usage constraints for the target.
    */
   KeepConstraint[] constraintAdditions() default {};
 
   /**
-   * Define the constraints that are allowed to be modified.
-   *
-   * <p>The specified option constraints do not need to be preserved for the target.
-   *
-   * <p>Mutually exclusive with the following other properties defining constraints:
-   *
-   * <ul>
-   *   <li>constraints
-   *   <li>constraintAdditions
-   *   <li>disallow
-   * </ul>
-   *
-   * <p>If nothing is specified for constraints the default is the default for {@link #constraints}.
-   *
-   * @return Option constraints allowed to be modified for the target.
-   * @deprecated Use {@link #constraints} instead.
-   */
-  @Deprecated
-  KeepOption[] allow() default {};
-
-  /**
-   * Define the constraints that are not allowed to be modified.
-   *
-   * <p>The specified option constraints *must* be preserved for the target.
-   *
-   * <p>Mutually exclusive with the following other properties defining constraints:
-   *
-   * <ul>
-   *   <li>constraints
-   *   <li>constraintAdditions
-   *   <li>allow
-   * </ul>
-   *
-   * <p>If nothing is specified for constraints the default is the default for {@link #constraints}.
-   *
-   * @return Option constraints not allowed to be modified for the target.
-   * @deprecated Use {@link #constraints} instead.
-   */
-  @Deprecated
-  KeepOption[] disallow() default {};
-
-  /**
    * Define the class pattern by reference to a binding.
    *
    * <p>Mutually exclusive with the following other properties defining class:
@@ -163,8 +122,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classAnnotatedByClassName
    *   <li>classAnnotatedByClassConstant
    *   <li>classAnnotatedByClassNamePattern
@@ -236,8 +193,6 @@
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -259,8 +214,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassConstant
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -279,8 +232,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -302,8 +253,6 @@
    *   <li>instanceOfClassName
    *   <li>instanceOfClassNameExclusive
    *   <li>instanceOfClassConstant
-   *   <li>extendsClassName
-   *   <li>extendsClassConstant
    *   <li>classFromBinding
    * </ul>
    *
@@ -314,56 +263,6 @@
   Class<?> instanceOfClassConstantExclusive() default Object.class;
 
   /**
-   * Define the instance-of pattern as classes extending the fully qualified class name.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassConstant
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class name that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassName} instead.
-   */
-  @Deprecated
-  String extendsClassName() default "";
-
-  /**
-   * Define the instance-of pattern as classes extending the referenced Class constant.
-   *
-   * <p>The pattern is exclusive in that it does not match classes that are instances of the
-   * pattern, but only those that are instances of classes that are subclasses of the pattern.
-   *
-   * <p>Mutually exclusive with the following other properties defining instance-of:
-   *
-   * <ul>
-   *   <li>instanceOfClassName
-   *   <li>instanceOfClassNameExclusive
-   *   <li>instanceOfClassConstant
-   *   <li>instanceOfClassConstantExclusive
-   *   <li>extendsClassName
-   *   <li>classFromBinding
-   * </ul>
-   *
-   * <p>If none are specified the default is to match any class instance.
-   *
-   * @return The class constant that defines what the class must extend.
-   * @deprecated This property is deprecated, use {@link #instanceOfClassConstant} instead.
-   */
-  @Deprecated
-  Class<?> extendsClassConstant() default Object.class;
-
-  /**
    * Define the class-annotated-by pattern by fully qualified class name.
    *
    * <p>Mutually exclusive with the following other properties defining class-annotated-by:
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
index b547778..2bcf8dd 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
@@ -83,15 +83,32 @@
    *
    * <p>The specified constraints must remain valid for the target.
    *
-   * <p>The default constraints depend on the type of the target.
+   * <p>The default constraints depend on the kind of the target. For all targets the default
+   * constraints include:
    *
    * <ul>
-   *   <li>For classes, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#CLASS_INSTANTIATE}}
-   *   <li>For methods, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#METHOD_INVOKE}}
-   *   <li>For fields, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#FIELD_GET}, {@link KeepConstraint#FIELD_SET}}
+   *   <li>{@link KeepConstraint#LOOKUP}
+   *   <li>{@link KeepConstraint#NAME}
+   *   <li>{@link KeepConstraint#VISIBILITY_RELAX}
+   * </ul>
+   *
+   * <p>For classes the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#CLASS_INSTANTIATE}
+   * </ul>
+   *
+   * <p>For methods the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#METHOD_INVOKE}
+   * </ul>
+   *
+   * <p>For fields the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#FIELD_GET}
+   *   <li>{@link KeepConstraint#FIELD_SET}
    * </ul>
    *
    * @return Usage constraints for the target.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
index a139965..7133e96 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
@@ -83,15 +83,32 @@
    *
    * <p>The specified constraints must remain valid for the target.
    *
-   * <p>The default constraints depend on the type of the target.
+   * <p>The default constraints depend on the kind of the target. For all targets the default
+   * constraints include:
    *
    * <ul>
-   *   <li>For classes, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#CLASS_INSTANTIATE}}
-   *   <li>For methods, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#METHOD_INVOKE}}
-   *   <li>For fields, the default is {{@link KeepConstraint#LOOKUP}, {@link KeepConstraint#NAME},
-   *       {@link KeepConstraint#FIELD_GET}, {@link KeepConstraint#FIELD_SET}}
+   *   <li>{@link KeepConstraint#LOOKUP}
+   *   <li>{@link KeepConstraint#NAME}
+   *   <li>{@link KeepConstraint#VISIBILITY_RELAX}
+   * </ul>
+   *
+   * <p>For classes the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#CLASS_INSTANTIATE}
+   * </ul>
+   *
+   * <p>For methods the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#METHOD_INVOKE}
+   * </ul>
+   *
+   * <p>For fields the default constraints also include:
+   *
+   * <ul>
+   *   <li>{@link KeepConstraint#FIELD_GET}
+   *   <li>{@link KeepConstraint#FIELD_SET}
    * </ul>
    *
    * @return Usage constraints for the target.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ConstraintsParser.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ConstraintsParser.java
index 05b9fe8..e89279b 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ConstraintsParser.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ConstraintsParser.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.keepanno.asm.ConstraintsParser.ConstraintsProperty;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.Target;
 import com.android.tools.r8.keepanno.ast.KeepConstraints;
-import com.android.tools.r8.keepanno.ast.KeepOptions;
 import com.android.tools.r8.keepanno.ast.ParsingContext;
 import java.util.function.Consumer;
 import org.objectweb.asm.AnnotationVisitor;
@@ -16,9 +15,7 @@
 
   public enum ConstraintsProperty {
     CONSTRAINTS,
-    ADDITIONS,
-    ALLOW,
-    DISALLOW
+    ADDITIONS
   }
 
   public ConstraintsParser(ParsingContext parsingContext) {
@@ -36,20 +33,6 @@
             constraints -> setValue.accept(KeepConstraints.defaultAdditions(constraints)));
       case CONSTRAINTS:
         return new KeepConstraintsVisitor(parsingContext, setValue::accept);
-      case ALLOW:
-        return new KeepOptionsVisitor(
-            parsingContext,
-            options ->
-                setValue.accept(
-                    KeepConstraints.fromLegacyOptions(
-                        KeepOptions.allowBuilder().addAll(options).build())));
-      case DISALLOW:
-        return new KeepOptionsVisitor(
-            parsingContext,
-            options ->
-                setValue.accept(
-                    KeepConstraints.fromLegacyOptions(
-                        KeepOptions.disallowBuilder().addAll(options).build())));
       default:
         return null;
     }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
index b37f18f..8c85b9a 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
@@ -748,8 +748,6 @@
       constraintsParser = new ConstraintsParser(parsingContext);
       constraintsParser.setProperty(Target.constraints, ConstraintsProperty.CONSTRAINTS);
       constraintsParser.setProperty(Target.constraintAdditions, ConstraintsProperty.ADDITIONS);
-      constraintsParser.setProperty(Target.allow, ConstraintsProperty.ALLOW);
-      constraintsParser.setProperty(Target.disallow, ConstraintsProperty.DISALLOW);
     }
 
     @Override
@@ -859,8 +857,6 @@
       constraintsParser = new ConstraintsParser(parsingContext);
       constraintsParser.setProperty(Target.constraints, ConstraintsProperty.CONSTRAINTS);
       constraintsParser.setProperty(Target.constraintAdditions, ConstraintsProperty.ADDITIONS);
-      constraintsParser.setProperty(Target.allow, ConstraintsProperty.ALLOW);
-      constraintsParser.setProperty(Target.disallow, ConstraintsProperty.DISALLOW);
     }
 
     @Override
@@ -1211,8 +1207,6 @@
           Item.instanceOfClassNameExclusive, InstanceOfProperties.NAME_EXCL);
       instanceOfParser.setProperty(
           Item.instanceOfClassConstantExclusive, InstanceOfProperties.CONSTANT_EXCL);
-      instanceOfParser.setProperty(Item.extendsClassName, InstanceOfProperties.NAME_EXCL);
-      instanceOfParser.setProperty(Item.extendsClassConstant, InstanceOfProperties.CONSTANT_EXCL);
 
       parsers = ImmutableList.of(classNameParser, annotatedByParser, instanceOfParser);
     }
@@ -1812,8 +1806,6 @@
       optionsParser = new ConstraintsParser(parsingContext);
       optionsParser.setProperty(Target.constraints, ConstraintsProperty.CONSTRAINTS);
       optionsParser.setProperty(Target.constraintAdditions, ConstraintsProperty.ADDITIONS);
-      optionsParser.setProperty(Target.allow, ConstraintsProperty.ALLOW);
-      optionsParser.setProperty(Target.disallow, ConstraintsProperty.DISALLOW);
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepOptionsVisitor.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepOptionsVisitor.java
deleted file mode 100644
index b369d2d..0000000
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepOptionsVisitor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.keepanno.asm;
-
-import com.android.tools.r8.keepanno.asm.KeepEdgeReader.Parent;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants;
-import com.android.tools.r8.keepanno.ast.AnnotationConstants.Option;
-import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption;
-import com.android.tools.r8.keepanno.ast.ParsingContext;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-public class KeepOptionsVisitor extends AnnotationVisitorBase {
-
-  private final Parent<Collection<KeepOption>> parent;
-  private final Set<KeepOption> options = new HashSet<>();
-
-  public KeepOptionsVisitor(ParsingContext parsingContext, Parent<Collection<KeepOption>> parent) {
-    super(parsingContext);
-    this.parent = parent;
-  }
-
-  @Override
-  public void visitEnum(String ignore, String descriptor, String value) {
-    if (!descriptor.equals(AnnotationConstants.Option.DESCRIPTOR)) {
-      super.visitEnum(ignore, descriptor, value);
-    }
-    KeepOption option;
-    switch (value) {
-      case Option.SHRINKING:
-        option = KeepOption.SHRINKING;
-        break;
-      case Option.OPTIMIZATION:
-        option = KeepOption.OPTIMIZING;
-        break;
-      case Option.OBFUSCATION:
-        option = KeepOption.OBFUSCATING;
-        break;
-      case Option.ACCESS_MODIFICATION:
-        option = KeepOption.ACCESS_MODIFICATION;
-        break;
-      case Option.ANNOTATION_REMOVAL:
-        option = KeepOption.ANNOTATION_REMOVAL;
-        break;
-      default:
-        super.visitEnum(ignore, descriptor, value);
-        return;
-    }
-    options.add(option);
-  }
-
-  @Override
-  public void visitEnd() {
-    parent.accept(options);
-    super.visitEnd();
-  }
-}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
index a03cb6c..9828d43 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
@@ -79,8 +79,6 @@
     public static final String instanceOfClassConstant = "instanceOfClassConstant";
     public static final String instanceOfClassConstantExclusive =
         "instanceOfClassConstantExclusive";
-    public static final String extendsClassName = "extendsClassName";
-    public static final String extendsClassConstant = "extendsClassConstant";
     public static final String classAnnotatedByGroup = "class-annotated-by";
     public static final String classAnnotatedByClassName = "classAnnotatedByClassName";
     public static final String classAnnotatedByClassConstant = "classAnnotatedByClassConstant";
@@ -141,8 +139,6 @@
     public static final String constraintsGroup = "constraints";
     public static final String constraints = "constraints";
     public static final String constraintAdditions = "constraintAdditions";
-    public static final String allow = "allow";
-    public static final String disallow = "disallow";
   }
 
   public static final class Kind {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
index a4be849..c319a3c 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepConstraints.java
@@ -14,10 +14,6 @@
 
 public abstract class KeepConstraints {
 
-  public static KeepConstraints fromLegacyOptions(KeepOptions options) {
-    return new LegacyOptions(options);
-  }
-
   public static KeepConstraints defaultConstraints() {
     return Defaults.INSTANCE;
   }
@@ -46,31 +42,6 @@
     }
   }
 
-  private static class LegacyOptions extends KeepConstraints {
-
-    private final KeepOptions options;
-
-    private LegacyOptions(KeepOptions options) {
-      this.options = options;
-    }
-
-    @Override
-    public String toString() {
-      return options.toString();
-    }
-
-    @Override
-    public KeepOptions convertToKeepOptions(KeepOptions defaultOptions) {
-      return options;
-    }
-
-    @Override
-    public Set<KeepAttribute> getRequiredKeepAttributes() {
-      // The legacy option specification does not have any implicit/required attributes.
-      return Collections.emptySet();
-    }
-  }
-
   private static class Defaults extends KeepConstraints {
 
     private static final Defaults INSTANCE = new Defaults();
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
index e6bcf49..8367dfe 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepTarget.java
@@ -23,10 +23,6 @@
       return setItemReference(itemPattern.toItemReference());
     }
 
-    public Builder setOptions(KeepOptions options) {
-      return setConstraints(KeepConstraints.fromLegacyOptions(options));
-    }
-
     public Builder setConstraints(KeepConstraints constraints) {
       this.constraints = constraints;
       return this;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java
index b3baa2e..0eace48 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java
@@ -12,7 +12,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.keepanno.annotations.KeepOption;
+import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.StringPattern;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
@@ -100,24 +100,24 @@
   }
 
   @Test
-  public void testInvalidExtendsDecl() {
+  public void testInvalidInstanceOfDecl() {
     assertThrowsWith(
-        () -> extractRuleForClass(MultipleExtendsDeclarations.class),
+        () -> extractRuleForClass(MultipleInstanceOfDeclarations.class),
         allOf(
             containsString("Multiple properties"),
-            containsString("extendsClassName"),
-            containsString("extendsClassConstant"),
+            containsString("instanceOfClassName"),
+            containsString("instanceOfClassConstant"),
             containsString("at property-group: instance-of"),
             containsString("at annotation: @UsesReflection"),
             containsString("at method: void main")));
   }
 
-  static class MultipleExtendsDeclarations {
+  static class MultipleInstanceOfDeclarations {
 
     @UsesReflection(
         @KeepTarget(
-            extendsClassName = "foo",
-            extendsClassConstant = MultipleClassDeclarations.class))
+            instanceOfClassName = "foo",
+            instanceOfClassConstant = MultipleClassDeclarations.class))
     public static void main(String[] args) {
       System.out.println("Hello, world");
     }
@@ -144,21 +144,21 @@
   @Test
   public void testInvalidOptionsDecl() {
     assertThrowsWith(
-        () -> extractRuleForClass(MultipleOptionDeclarations.class),
+        () -> extractRuleForClass(MultipleConstraintDeclarations.class),
         allOf(
             containsString("Multiple properties"),
-            containsString("allow"),
-            containsString("disallow"),
+            containsString("constraints"),
+            containsString("constraintAdditions"),
             containsString("at property-group: constraints")));
   }
 
-  static class MultipleOptionDeclarations {
+  static class MultipleConstraintDeclarations {
 
     @UsesReflection(
         @KeepTarget(
             classConstant = A.class,
-            allow = {KeepOption.OPTIMIZATION},
-            disallow = {KeepOption.SHRINKING}))
+            constraints = {KeepConstraint.LOOKUP},
+            constraintAdditions = {KeepConstraint.NAME}))
     public static void main(String[] args) {
       System.out.println("Hello, world");
     }
diff --git a/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java b/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
index c504c4a..d2deccb 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.keepanno.ast.KeepBindings.KeepBindingSymbol;
-import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption;
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
@@ -59,8 +58,14 @@
   }
 
   @Test
-  public void testSoftPinViaDisallow() {
-    KeepOptions disallowOptions = KeepOptions.disallow(KeepOption.OPTIMIZING);
+  public void testSoftPinViaConstraints() {
+    KeepConstraints constraints =
+        KeepConstraints.builder()
+            .add(KeepConstraint.classInstantiate())
+            .add(KeepConstraint.methodInvoke())
+            .add(KeepConstraint.fieldGet())
+            .add(KeepConstraint.fieldSet())
+            .build();
     KeepEdge edge =
         KeepEdge.builder()
             .setConsequences(
@@ -68,16 +73,17 @@
                     .addTarget(
                         KeepTarget.builder()
                             .setItemPattern(KeepItemPattern.anyClass())
-                            .setOptions(disallowOptions)
+                            .setConstraints(constraints)
                             .build())
                     .addTarget(
                         KeepTarget.builder()
                             .setItemPattern(KeepItemPattern.anyMember())
-                            .setOptions(disallowOptions)
+                            .setConstraints(constraints)
                             .build())
                     .build())
             .build();
-    // Disallow will issue the full inverse of the known options, e.g., 'allowaccessmodification'.
+    // Pinning just the use constraints points will issue the full inverse of the known options,
+    // e.g., 'allowaccessmodification'.
     List<String> options = ImmutableList.of("shrinking", "obfuscation", "accessmodification");
     String allows = String.join(",allow", options);
     // The "any" item will be split in two rules, one for the targeted types and one for the
@@ -88,34 +94,6 @@
             "-keepclassmembers,allow" + allows + " class ** { *; }"),
         extract(edge));
   }
-
-  @Test
-  public void testSoftPinViaAllow() {
-    KeepOptions allowOptions = KeepOptions.allow(KeepOption.OBFUSCATING, KeepOption.SHRINKING);
-    KeepEdge edge =
-        KeepEdge.builder()
-            .setConsequences(
-                KeepConsequences.builder()
-                    .addTarget(
-                        KeepTarget.builder()
-                            .setItemPattern(KeepItemPattern.anyClass())
-                            .setOptions(allowOptions)
-                            .build())
-                    .addTarget(
-                        KeepTarget.builder()
-                            .setItemPattern(KeepItemPattern.anyMember())
-                            .setOptions(allowOptions)
-                            .build())
-                    .build())
-            .build();
-    // Allow is just the ordered list of options.
-    assertEquals(
-        StringUtils.unixLines(
-            "-keep,allowshrinking,allowobfuscation class ** { void finalize(); }",
-            "-keepclassmembers,allowshrinking,allowobfuscation class ** { *; }"),
-        extract(edge));
-  }
-
   @Test
   public void testKeepClass() {
     KeepTarget target = target(classItem(CLASS));
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
index 6344760..c6bb24b 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
@@ -488,34 +488,7 @@
     }
 
     private Group getKeepConstraintsGroup() {
-      return new Group(CONSTRAINTS_GROUP)
-          .addMember(constraints())
-          .addMember(constraintAdditions())
-          .addMember(
-              new GroupMember("allow")
-                  .setDeprecated("Use " + docLink(constraints()) + " instead.")
-                  .setDocTitle(
-                      "Define the " + CONSTRAINTS_GROUP + " that are allowed to be modified.")
-                  .addParagraph(
-                      "The specified option constraints do not need to be preserved for the"
-                          + " target.")
-                  .setDocReturn("Option constraints allowed to be modified for the target.")
-                  .defaultArrayEmpty(KeepOption.class))
-          .addMember(
-              new GroupMember("disallow")
-                  .setDeprecated("Use " + docLink(constraints()) + " instead.")
-                  .setDocTitle(
-                      "Define the " + CONSTRAINTS_GROUP + " that are not allowed to be modified.")
-                  .addParagraph(
-                      "The specified option constraints *must* be preserved for the target.")
-                  .setDocReturn("Option constraints not allowed to be modified for the target.")
-                  .defaultArrayEmpty(KeepOption.class))
-          .addDocFooterParagraph(
-              "If nothing is specified for "
-                  + CONSTRAINTS_GROUP
-                  + " the default is the default for "
-                  + docLink(constraints())
-                  + ".");
+      return new Group(CONSTRAINTS_GROUP).addMember(constraints()).addMember(constraintAdditions());
     }
 
     private static String docLinkList(Enum<?>... values) {
@@ -526,20 +499,19 @@
       return new GroupMember("constraints")
           .setDocTitle("Define the usage constraints of the target.")
           .addParagraph("The specified constraints must remain valid for the target.")
-          .addParagraph("The default constraints depend on the type of the target.")
+          .addParagraph(
+              "The default constraints depend on the kind of the target.",
+              "For all targets the default constraints include:")
           .addUnorderedList(
-              "For classes, the default is "
-                  + docLinkList(
-                      KeepConstraint.LOOKUP, KeepConstraint.NAME, KeepConstraint.CLASS_INSTANTIATE),
-              "For methods, the default is "
-                  + docLinkList(
-                      KeepConstraint.LOOKUP, KeepConstraint.NAME, KeepConstraint.METHOD_INVOKE),
-              "For fields, the default is "
-                  + docLinkList(
-                      KeepConstraint.LOOKUP,
-                      KeepConstraint.NAME,
-                      KeepConstraint.FIELD_GET,
-                      KeepConstraint.FIELD_SET))
+              docLink(KeepConstraint.LOOKUP),
+              docLink(KeepConstraint.NAME),
+              docLink(KeepConstraint.VISIBILITY_RELAX))
+          .addParagraph("For classes the default constraints also include:")
+          .addUnorderedList(docLink(KeepConstraint.CLASS_INSTANTIATE))
+          .addParagraph("For methods the default constraints also include:")
+          .addUnorderedList(docLink(KeepConstraint.METHOD_INVOKE))
+          .addParagraph("For fields the default constraints also include:")
+          .addUnorderedList(docLink(KeepConstraint.FIELD_GET), docLink(KeepConstraint.FIELD_SET))
           .setDocReturn("Usage constraints for the target.")
           .defaultArrayEmpty(KeepConstraint.class);
     }
@@ -657,42 +629,12 @@
           .defaultObjectClass();
     }
 
-    private GroupMember extendsClassName() {
-      return new GroupMember("extendsClassName")
-          .setDocTitle(
-              "Define the "
-                  + INSTANCE_OF_GROUP
-                  + " pattern as classes extending the fully qualified class name.")
-          .addParagraph(getInstanceOfExclusiveDoc())
-          .setDeprecated(
-              "This property is deprecated, use " + docLink(instanceOfClassName()) + " instead.")
-          .setDocReturn("The class name that defines what the class must extend.")
-          .defaultEmptyString();
-    }
-
-    private GroupMember extendsClassConstant() {
-      return new GroupMember("extendsClassConstant")
-          .setDocTitle(
-              "Define the "
-                  + INSTANCE_OF_GROUP
-                  + " pattern as classes extending the referenced Class constant.")
-          .addParagraph(getInstanceOfExclusiveDoc())
-          .setDeprecated(
-              "This property is deprecated, use "
-                  + docLink(instanceOfClassConstant())
-                  + " instead.")
-          .setDocReturn("The class constant that defines what the class must extend.")
-          .defaultObjectClass();
-    }
-
     private Group createClassInstanceOfPatternGroup() {
       return new Group(INSTANCE_OF_GROUP)
           .addMember(instanceOfClassName())
           .addMember(instanceOfClassNameExclusive())
           .addMember(instanceOfClassConstant())
           .addMember(instanceOfClassConstantExclusive())
-          .addMember(extendsClassName())
-          .addMember(extendsClassConstant())
           .addDocFooterParagraph(
               "If none are specified the default is to match any class instance.");
     }
