diff --git a/src/Finder/GlobFinder.php b/src/Finder/GlobFinder.php
index 8994e792346f9f40c6178634235835dfb5edd678..a1ba30049adaa6364cd5d5afd3d5bb00ea019889 100644
--- a/src/Finder/GlobFinder.php
+++ b/src/Finder/GlobFinder.php
@@ -10,6 +10,10 @@ final class GlobFinder implements MigrationFinder {
 	public function find_migrations( string $directory ): array {
 		$dir = realpath( $directory );
 
+		if ( $dir === false ) {
+			return [];
+		}
+
 		$files = glob( rtrim( $dir, '/' ) . '/Version*.php' );
 		if ( $files === false ) {
 			$files = [];
@@ -46,7 +50,7 @@ final class GlobFinder implements MigrationFinder {
 
 	/**
 	 * @param string[] $included_files
-	 * @return \ReflectionClass[]
+	 * @return \ReflectionClass<AbstractMigration>[]
 	 * @throws \ReflectionException
 	 */
 	private function load_migration_classes( array $included_files ): array {
@@ -54,10 +58,15 @@ final class GlobFinder implements MigrationFinder {
 		foreach ( get_declared_classes() as $class ) {
 			$r = new \ReflectionClass( $class );
 
+			if ( ! $r->isSubclassOf( AbstractMigration::class ) ) {
+				continue;
+			}
+
 			if ( in_array( $r->getFileName(), $included_files, true ) ) {
 				$classes[] = $r;
 			}
 		}
+
 		return $classes;
 	}
 }
diff --git a/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php b/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..765f4a5fbdb7f51efd32213c8cbe8438fe9b1582
--- /dev/null
+++ b/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace WPDesk\Migrations\Tests\Finder;
+
+use WPDesk\Migrations\Finder\GlobFinder;
+use PHPUnit\Framework\TestCase;
+
+class GlobFinderTest extends TestCase {
+
+	public function test_skip_unexpected_classes() {
+		$finder = new GlobFinder();
+		$migrations = $finder->find_migrations(__DIR__ . '/../../../../fixtures/migrations');
+
+		self::assertCount(2, $migrations);
+		self::assertContains(
+			'WPDesk\Migrations\Tests\fixtures\migrations\Version_10',
+			$migrations
+		);
+
+		self::assertContains(
+			'WPDesk\Migrations\Tests\fixtures\migrations\Version_11',
+			$migrations
+		);
+
+		self::assertNotContains(
+			'WPDesk\Migrations\Tests\fixtures\migrations\Borked_Version_01',
+			$migrations
+		);
+	}
+
+}
diff --git a/tests/fixtures/migrations/Borked_Version_01.php b/tests/fixtures/migrations/Borked_Version_01.php
new file mode 100644
index 0000000000000000000000000000000000000000..35f45e2422bb349c41939f8b590df5f7e5b36e7f
--- /dev/null
+++ b/tests/fixtures/migrations/Borked_Version_01.php
@@ -0,0 +1,14 @@
+<?php
+declare( strict_types=1 );
+
+namespace WPDesk\Migrations\Tests\fixtures\migrations;
+
+use WPDesk\Migrations\AbstractMigration;
+
+/** Invalid name */
+class Borked_Version_01 extends AbstractMigration {
+
+	public function up(): bool {
+		return true;
+	}
+}
diff --git a/tests/fixtures/migrations/Version_02.php b/tests/fixtures/migrations/Version_02.php
new file mode 100644
index 0000000000000000000000000000000000000000..a06b48443f0b9f31a48840f82dab1a6163d82161
--- /dev/null
+++ b/tests/fixtures/migrations/Version_02.php
@@ -0,0 +1,9 @@
+<?php
+declare( strict_types=1 );
+
+namespace WPDesk\Migrations\Tests\fixtures\migrations;
+
+/** Not extending abstract migration */
+class Version_02 {
+
+}