diff --git a/graphene/__init__.py b/graphene/__init__.py
index 88404d62..71066499 100644
--- a/graphene/__init__.py
+++ b/graphene/__init__.py
@@ -11,7 +11,7 @@ from .core import (
     Interface,
     Mutation,
     Scalar,
-    BaseType,
+    InstanceType,
     LazyType,
     Argument,
     Field,
@@ -51,7 +51,7 @@ __all__ = [
     'NonNull',
     'signals',
     'Schema',
-    'BaseType',
+    'InstanceType',
     'LazyType',
     'ObjectType',
     'InputObjectType',
diff --git a/graphene/core/__init__.py b/graphene/core/__init__.py
index d27a72bb..9e8c7108 100644
--- a/graphene/core/__init__.py
+++ b/graphene/core/__init__.py
@@ -11,7 +11,7 @@ from .classtypes import (
 )
 
 from .types import (
-    BaseType,
+    InstanceType,
     LazyType,
     Argument,
     Field,
@@ -35,7 +35,7 @@ __all__ = [
     'List',
     'NonNull',
     'Schema',
-    'BaseType',
+    'InstanceType',
     'LazyType',
     'ObjectType',
     'InputObjectType',
diff --git a/graphene/core/schema.py b/graphene/core/schema.py
index e2f24b57..960f0aca 100644
--- a/graphene/core/schema.py
+++ b/graphene/core/schema.py
@@ -12,7 +12,7 @@ from graphene import signals
 
 from ..plugins import CamelCase, Plugin
 from .classtypes.base import ClassType
-from .types.base import BaseType
+from .types.base import InstanceType
 
 
 class GraphQLSchema(_GraphQLSchema):
@@ -59,7 +59,7 @@ class Schema(object):
         if not _type:
             return
         is_classtype = inspect.isclass(_type) and issubclass(_type, ClassType)
-        is_instancetype = isinstance(_type, BaseType)
+        is_instancetype = isinstance(_type, InstanceType)
         if is_classtype or is_instancetype:
             if _type not in self._types:
                 internal_type = self.get_internal_type(_type)
diff --git a/graphene/core/types/__init__.py b/graphene/core/types/__init__.py
index 0ffa52bb..51512ec4 100644
--- a/graphene/core/types/__init__.py
+++ b/graphene/core/types/__init__.py
@@ -1,4 +1,4 @@
-from .base import BaseType, LazyType, OrderedType
+from .base import InstanceType, LazyType, OrderedType
 from .argument import Argument, ArgumentsGroup, to_arguments
 from .definitions import List, NonNull
 # Compatibility import
@@ -8,7 +8,7 @@ from .scalars import String, ID, Boolean, Int, Float
 from .field import Field, InputField
 
 __all__ = [
-    'BaseType',
+    'InstanceType',
     'LazyType',
     'OrderedType',
     'Argument',
diff --git a/graphene/core/types/base.py b/graphene/core/types/base.py
index 35797f8e..96501a19 100644
--- a/graphene/core/types/base.py
+++ b/graphene/core/types/base.py
@@ -4,14 +4,13 @@ from functools import partial, total_ordering
 import six
 
 
-class BaseType(object):
+class InstanceType(object):
 
-    @classmethod
-    def internal_type(cls, schema):
-        return getattr(cls, 'T', None)
+    def internal_type(self, schema):
+        raise NotImplementedError("internal_type for type {} is not implemented".format(self.__class__.__name__))
 
 
-class MountType(BaseType):
+class MountType(InstanceType):
     parent = None
 
     def mount(self, cls):
@@ -129,11 +128,11 @@ class MountedType(FieldType, ArgumentType):
     pass
 
 
-class NamedType(BaseType):
+class NamedType(InstanceType):
     pass
 
 
-class GroupNamedType(BaseType):
+class GroupNamedType(InstanceType):
 
     def __init__(self, *types):
         self.types = types
diff --git a/graphene/core/types/scalars.py b/graphene/core/types/scalars.py
index d0d315b4..9d7f5aeb 100644
--- a/graphene/core/types/scalars.py
+++ b/graphene/core/types/scalars.py
@@ -4,21 +4,27 @@ from graphql.core.type import (GraphQLBoolean, GraphQLFloat, GraphQLID,
 from .base import MountedType
 
 
-class String(MountedType):
-    T = GraphQLString
+class ScalarType(MountedType):
+
+    def internal_type(self, schema):
+        return self._internal_type
 
 
-class Int(MountedType):
-    T = GraphQLInt
+class String(ScalarType):
+    _internal_type = GraphQLString
 
 
-class Boolean(MountedType):
-    T = GraphQLBoolean
+class Int(ScalarType):
+    _internal_type = GraphQLInt
 
 
-class ID(MountedType):
-    T = GraphQLID
+class Boolean(ScalarType):
+    _internal_type = GraphQLBoolean
 
 
-class Float(MountedType):
-    T = GraphQLFloat
+class ID(ScalarType):
+    _internal_type = GraphQLID
+
+
+class Float(ScalarType):
+    _internal_type = GraphQLFloat