isinstance(x, int) проверяет, является ли x экземпляром класса int или любого из его подклассов.
type(x) == int проверяет, является ли x экземпляром именно класса int, без учета подклассов.
Таким образом, isinstance учитывает наследование, а type - нет.
Основное различие между isinstance(x, int) и type(x) == int заключается в том, как они обрабатывают наследование.
isinstance(x, int) проверяет, является ли объект x экземпляром класса int ИЛИ экземпляром любого класса, унаследованного от int. Другими словами, она вернет True, если x является экземпляром int или подклассом int.
type(x) == int, напротив, проверяет, является ли тип объекта x точно классом int.  Она вернет True только в том случае, если type(x) равен int, и вернет False, если x является экземпляром подкласса int.
Пример:
class MyInt(int):
    pass
x = MyInt(5)
print(isinstance(x, int))  # Выведет True, так как MyInt - подкласс int
print(type(x) == int)       # Выведет False, так как тип x - MyInt, а не int
Когда что использовать:
isinstance() следует использовать, когда вам нужно проверить, является ли объект экземпляром определенного класса или любого из его подклассов.  Это обычно более гибкий и идиоматичный подход в Python, особенно при работе с полиморфизмом.type() следует использовать, когда вам нужна абсолютная уверенность в том, что объект имеет именно тот тип, который вы ожидаете, и вы не хотите учитывать подклассы.  Такая потребность возникает реже.В большинстве случаев рекомендуется использовать isinstance(), так как это более надежный и гибкий подход, который учитывает наследование и полиморфизм.