diff --git a/src/language.yacc b/src/language.yacc
index aa30623fec4763d37388bb1b4381d87d7b31fab2..4f1b8ab92a2caa90936cc1f985d9993926113a90 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -1375,6 +1375,16 @@ basic_type:
 
 identifier_type: idents
   {
+    fix_type_field($1);
+
+    if (!pike_types_le($1->type, typeable_type_string) &&
+	(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
+      yytype_report(REPORT_WARNING,
+		    $1->current_file, $1->line_number, typeable_type_string,
+		    $1->current_file, $1->line_number, $1->type,
+		    0, "Invalid type.");
+    }
+
     resolv_constant($1);
 
     if (TYPEOF(Pike_sp[-1]) == T_TYPE) {
diff --git a/src/las.c b/src/las.c
index b72901dd6fbb9c16aa9d7d9d0f4f8f8e00718b7a..e95a18fe5980dff2fa01eaf452de337db866f5d4 100644
--- a/src/las.c
+++ b/src/las.c
@@ -1614,6 +1614,16 @@ void resolv_program(node *n)
 {
   check_tree(n,0);
 
+  fix_type_field(n);
+
+  if (!pike_types_le(n->type, inheritable_type_string) &&
+      (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
+    yytype_report(REPORT_WARNING,
+		  n->current_file, n->line_number, inheritable_type_string,
+		  n->current_file, n->line_number, n->type,
+		  0, "Not a valid object type.\n");
+  }
+
   resolv_class(n);
   switch(TYPEOF(Pike_sp[-1]))
   {
diff --git a/src/pike_types.c b/src/pike_types.c
index e07323709522fa946099635f1071cac050a2caeb..113790f2b11aff5a604de62f992e8b2058efab6b 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -100,6 +100,8 @@ PMOD_EXPORT struct pike_type *type_type_string;
 PMOD_EXPORT struct pike_type *mixed_type_string;
 PMOD_EXPORT struct pike_type *void_type_string;
 PMOD_EXPORT struct pike_type *zero_type_string;
+PMOD_EXPORT struct pike_type *inheritable_type_string;
+PMOD_EXPORT struct pike_type *typeable_type_string;
 PMOD_EXPORT struct pike_type *enumerable_type_string;
 PMOD_EXPORT struct pike_type *any_type_string;
 PMOD_EXPORT struct pike_type *weak_type_string;	/* array|mapping|multiset|function */
@@ -8701,6 +8703,13 @@ void init_types(void)
   type_type_string = CONSTTYPE(tType(tMix));
   void_type_string = CONSTTYPE(tVoid);
   zero_type_string = CONSTTYPE(tZero);
+  inheritable_type_string = CONSTTYPE(tOr3(tPrg(tObj), tObj,
+					   tFuncV(tNone, tOr(tVoid, tMix),
+						  tObj)));
+  typeable_type_string = CONSTTYPE(tOr4(tPrg(tObj), tObj,
+					tFuncV(tNone, tOr(tVoid, tMix),
+					       tObj),
+					tType(tMix)));
   enumerable_type_string = CONSTTYPE(tOr3(tString,tInt,tFloat));
   any_type_string = CONSTTYPE(tOr(tVoid,tMix));
   weak_type_string = CONSTTYPE(tOr4(tArray,tMultiset,tMapping,
@@ -8755,6 +8764,10 @@ void cleanup_pike_types(void)
   void_type_string = NULL;
   free_type(zero_type_string);
   zero_type_string = NULL;
+  free_type(inheritable_type_string);
+  inheritable_type_string = NULL;
+  free_type(typeable_type_string);
+  typeable_type_string = NULL;
   free_type(enumerable_type_string);
   enumerable_type_string = NULL;
   free_type(any_type_string);
diff --git a/src/pike_types.h b/src/pike_types.h
index 0f029d7071d9f28fe768fb10f35c90977e8c2d6e..e7ed267b3196a55c9b74db810458818734fb9634 100644
--- a/src/pike_types.h
+++ b/src/pike_types.h
@@ -136,6 +136,8 @@ PMOD_EXPORT extern struct pike_type *type_type_string;
 PMOD_EXPORT extern struct pike_type *mixed_type_string;
 PMOD_EXPORT extern struct pike_type *void_type_string;
 PMOD_EXPORT extern struct pike_type *zero_type_string;
+PMOD_EXPORT extern struct pike_type *inheritable_type_string;
+PMOD_EXPORT extern struct pike_type *typeable_type_string;
 PMOD_EXPORT extern struct pike_type *enumerable_type_string;
 PMOD_EXPORT extern struct pike_type *any_type_string;
 PMOD_EXPORT extern struct pike_type *weak_type_string;
diff --git a/src/program.c b/src/program.c
index 768488a8a2e4b5bf96bce4b1d77fc47432e5202e..45fc459819d8860243cccf3b1b2183b1610cbddc 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5031,6 +5031,16 @@ void compiler_do_inherit(node *n,
     return;
   }
 
+  fix_type_field(n);
+
+  if (!pike_types_le(n->type, inheritable_type_string) &&
+      (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
+    yytype_report(REPORT_WARNING,
+		  n->current_file, n->line_number, inheritable_type_string,
+		  n->current_file, n->line_number, n->type,
+		  0, "Program required for inherit.\n");
+  }
+
   switch(n->token)
   {
     case F_IDENTIFIER: