diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 8cb33072..3b10e9c9 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -77,8 +77,8 @@
-
-
+
+
diff --git a/src/xunit.analyzers.fixes/X2000/AssignableFromAssertionIsConfusinglyNamedFixer.cs b/src/xunit.analyzers.fixes/X2000/AssignableFromAssertionIsConfusinglyNamedFixer.cs
new file mode 100644
index 00000000..c1d59466
--- /dev/null
+++ b/src/xunit.analyzers.fixes/X2000/AssignableFromAssertionIsConfusinglyNamedFixer.cs
@@ -0,0 +1,79 @@
+using System.Composition;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CodeActions;
+using Microsoft.CodeAnalysis.CodeFixes;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.Editing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+
+namespace Xunit.Analyzers.Fixes;
+
+[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
+public class AssignableFromAssertionIsConfusinglyNamedFixer : BatchedCodeFixProvider
+{
+ public const string Key_UseIsType = "xUnit2032_UseIsType";
+
+ public AssignableFromAssertionIsConfusinglyNamedFixer() :
+ base(Descriptors.X2032_AssignableFromAssertionIsConfusinglyNamed.Id)
+ { }
+
+ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
+ {
+ var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
+ if (root is null)
+ return;
+
+ var invocation = root.FindNode(context.Span).FirstAncestorOrSelf();
+ if (invocation is null)
+ return;
+
+ var simpleNameSyntax = invocation.GetSimpleName();
+ if (simpleNameSyntax is null)
+ return;
+
+ var methodName = simpleNameSyntax.Identifier.Text;
+ if (!AssignableFromAssertionIsConfusinglyNamed.ReplacementMethods.TryGetValue(methodName, out var replacementName))
+ return;
+
+ context.RegisterCodeFix(
+ XunitCodeAction.Create(
+ ct => UseIsType(context.Document, invocation, simpleNameSyntax, replacementName, ct),
+ Key_UseIsType,
+ "Use Assert.{0}", replacementName
+ ),
+ context.Diagnostics
+ );
+ }
+
+ static async Task UseIsType(
+ Document document,
+ InvocationExpressionSyntax invocation,
+ SimpleNameSyntax simpleName,
+ string replacementName,
+ CancellationToken cancellationToken)
+ {
+ var editor = await DocumentEditor.CreateAsync(document, cancellationToken).ConfigureAwait(false);
+
+ editor.ReplaceNode(
+ invocation,
+ invocation
+ .ReplaceNode(
+ simpleName,
+ simpleName.WithIdentifier(Identifier(replacementName))
+ )
+ .WithArgumentList(
+ invocation
+ .ArgumentList
+ .AddArguments(
+ ParseArgumentList("false")
+ .Arguments[0]
+ .WithNameColon(NameColon("exactMatch"))
+ )
+ )
+ );
+
+ return editor.GetChangedDocument();
+ }
+}
diff --git a/src/xunit.analyzers.tests/Analyzers/X2000/AssignableFromAssertionIsConfusinglyNamedTests.cs b/src/xunit.analyzers.tests/Analyzers/X2000/AssignableFromAssertionIsConfusinglyNamedTests.cs
new file mode 100644
index 00000000..0918eb87
--- /dev/null
+++ b/src/xunit.analyzers.tests/Analyzers/X2000/AssignableFromAssertionIsConfusinglyNamedTests.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+using Xunit;
+using Xunit.Analyzers;
+using Verify = CSharpVerifier;
+using Verify_v2_Pre2_9_3 = CSharpVerifier;
+using Verify_v3_Pre0_6_0 = CSharpVerifier;
+
+public class AssignableFromAssertionIsConfusinglyNamedTests
+{
+ public static TheoryData Methods = new()
+ {
+ { "IsAssignableFrom", "IsType" },
+ { "IsNotAssignableFrom", "IsNotType"},
+ };
+
+ [Theory]
+ [MemberData(nameof(Methods))]
+ public async Task WhenReplacementAvailable_Triggers(
+ string method,
+ string replacement)
+ {
+ var source = string.Format(/* lang=c#-test */ """
+ using System;
+ using Xunit;
+
+ class TestClass {{
+ void TestMethod() {{
+ {{|#0:Assert.{0}