diff --git a/mypy/meet.py b/mypy/meet.py
--- a/mypy/meet.py
+++ b/mypy/meet.py
@@ -74,6 +74,11 @@ def narrow_declared_type(declared: Type, narrowed: Type) -> Type:
         return narrowed
     elif isinstance(declared, TypeType) and isinstance(narrowed, TypeType):
         return TypeType.make_normalized(narrow_declared_type(declared.item, narrowed.item))
+    elif (isinstance(declared, TypeType)
+          and isinstance(narrowed, Instance)
+          and narrowed.type.is_metaclass()):
+        # We'd need intersection types, so give up.
+        return declared
     elif isinstance(declared, (Instance, TupleType, TypeType, LiteralType)):
         return meet_types(declared, narrowed)
     elif isinstance(declared, TypedDictType) and isinstance(narrowed, Instance):

diff --git a/test-data/unit/check-narrowing.test b/test-data/unit/check-narrowing.test
--- a/test-data/unit/check-narrowing.test
+++ b/test-data/unit/check-narrowing.test
@@ -1053,3 +1053,23 @@ def f(d: Union[Foo, Bar]) -> None:
     d['x']
     reveal_type(d)  # N: Revealed type is "TypedDict('__main__.Foo', {'tag': Literal[__main__.E.FOO], 'x': builtins.int})"
 [builtins fixtures/dict.pyi]
+
+[case testNarrowingUsingMetaclass]
+# flags: --strict-optional
+from typing import Type
+
+class M(type):
+    pass
+
+class C: pass
+
+def f(t: Type[C]) -> None:
+    if type(t) is M:
+        reveal_type(t)  # N: Revealed type is "Type[__main__.C]"
+    else:
+        reveal_type(t)  # N: Revealed type is "Type[__main__.C]"
+    if type(t) is not M:
+        reveal_type(t)  # N: Revealed type is "Type[__main__.C]"
+    else:
+        reveal_type(t)  # N: Revealed type is "Type[__main__.C]"
+    reveal_type(t)  # N: Revealed type is "Type[__main__.C]"

Narrowing types using a metaclass can cause false positives
The `type(t) is not M` check should not narrow the type of `t`, since a subclass can have the metaclass:

```py
from typing import Type

class M(type):
    pass

class C: pass

class D(C, metaclass=M): pass

def f(t: Type[C]) -> None:
    if type(t) is not M:
        return
    reveal_type(t)  # <nothing>

f(D)
```

I'd expect that the revealed type to be `Type[C]`, not `<nothing>`. The latter can cause false positives.

This is a regression from mypy 0.812.

mypy/test/testcheck.py::TypeCheckSuite::testNarrowingUsingMetaclass