diff --git a/pydantic/utils.py b/pydantic/utils.py
--- a/pydantic/utils.py
+++ b/pydantic/utils.py
@@ -160,7 +160,10 @@ def truncate(v: Union[str], *, max_len: int = 80) -> str:
     if isinstance(v, str) and len(v) > (max_len - 2):
         # -3 so quote + string + … + quote has correct length
         return (v[: (max_len - 3)] + '…').__repr__()
-    v = v.__repr__()
+    try:
+        v = v.__repr__()
+    except TypeError:
+        v = type(v).__repr__(v)  # in case v is a type
     if len(v) > max_len:
         v = v[: max_len - 1] + '…'
     return v

diff --git a/tests/test_utils.py b/tests/test_utils.py
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -4,7 +4,7 @@
 
 import pytest
 
-from pydantic.utils import display_as_type, import_string, lenient_issubclass, make_dsn, validate_email
+from pydantic.utils import display_as_type, import_string, lenient_issubclass, make_dsn, truncate, validate_email
 
 try:
     import email_validator
@@ -146,3 +146,7 @@ class A(str):
 
 def test_lenient_issubclass_is_lenient():
     assert lenient_issubclass('a', 'a') is False
+
+
+def test_truncate_type():
+    assert truncate(object) == "<class 'object'>"

Call repr on model with class type field will cause exception
I define a model with class type field. It will raise exception when calling repr on this model.

env:
python version: ``3.6.4``
pydantic version: ``0.28``

code:
```py
import inspect
from pydantic import BaseSettings

class TestClass(object):
    pass


class TestModel(object):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not (inspect.isclass(v) and issubclass(v, TestClass)):
            raise ValueError(f'TestClass expected not {type(v)}')
        return v

class TestSettings(BaseSettings):
    cls: TestModel = None

# this line will raise exception
print(TestSettings(cls=TestClass))
```

exception：
```
Traceback (most recent call last):
  File "test.py", line 23, in <module>
    print(TestSettings(cls=TestClass))
  File "pydantic/main.py", line 534, in pydantic.main.BaseModel.__str__
  File "pydantic/main.py", line 530, in genexpr
  File "pydantic/main.py", line 530, in genexpr
  File "pydantic/utils.py", line 158, in pydantic.utils.truncate
TypeError: descriptor '__repr__' of 'object' object needs an argument
```

I think the problem is the class object  ``__repr__`` property is not callable. [pydantic/utils.py :158](https://github.com/samuelcolvin/pydantic/blob/dd44fda8a6f6eed961cd03ad1e70049e523cdb40/pydantic/utils.py#L158)

```
def truncate(v: Union[str], *, max_len: int = 80) -> str:
    """
    Truncate a value and add a unicode ellipsis (three dots) to the end if it was too long
    """
    if isinstance(v, str) and len(v) > (max_len - 2):
        # -3 so quote + string + … + quote has correct length
        return (v[: (max_len - 3)] + '…').__repr__()
    v = v.__repr__()
    if len(v) > max_len:
        v = v[: max_len - 1] + '…'
    return v
```

Call repr on model with class type field will cause exception
I define a model with class type field. It will raise exception when calling repr on this model.

env:
python version: ``3.6.4``
pydantic version: ``0.28``

code:
```py
import inspect
from pydantic import BaseSettings

class TestClass(object):
    pass


class TestModel(object):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not (inspect.isclass(v) and issubclass(v, TestClass)):
            raise ValueError(f'TestClass expected not {type(v)}')
        return v

class TestSettings(BaseSettings):
    cls: TestModel = None

# this line will raise exception
print(TestSettings(cls=TestClass))
```

exception：
```
Traceback (most recent call last):
  File "test.py", line 23, in <module>
    print(TestSettings(cls=TestClass))
  File "pydantic/main.py", line 534, in pydantic.main.BaseModel.__str__
  File "pydantic/main.py", line 530, in genexpr
  File "pydantic/main.py", line 530, in genexpr
  File "pydantic/utils.py", line 158, in pydantic.utils.truncate
TypeError: descriptor '__repr__' of 'object' object needs an argument
```

I think the problem is the class object  ``__repr__`` property is not callable. [pydantic/utils.py :158](https://github.com/samuelcolvin/pydantic/blob/dd44fda8a6f6eed961cd03ad1e70049e523cdb40/pydantic/utils.py#L158)

```
def truncate(v: Union[str], *, max_len: int = 80) -> str:
    """
    Truncate a value and add a unicode ellipsis (three dots) to the end if it was too long
    """
    if isinstance(v, str) and len(v) > (max_len - 2):
        # -3 so quote + string + … + quote has correct length
        return (v[: (max_len - 3)] + '…').__repr__()
    v = v.__repr__()
    if len(v) > max_len:
        v = v[: max_len - 1] + '…'
    return v
```


tests/test_utils.py::test_truncate_type
tests/test_utils.py::test_address_valid[foobar@example.com-foobar-foobar@example.com] tests/test_utils.py::test_address_valid[s@muelcolvin.com-s-s@muelcolvin.com] tests/test_utils.py::test_address_valid[Samuel tests/test_utils.py::test_address_valid[foobar tests/test_utils.py::test_address_valid[ tests/test_utils.py::test_address_valid[foo.bar@example.com tests/test_utils.py::test_address_valid[foo tests/test_utils.py::test_address_valid[FOO tests/test_utils.py::test_address_valid[<FOOBAR@example.com> tests/test_utils.py::test_address_valid[\xf1o\xf1\xf3@example.com-\xf1o\xf1\xf3-\xf1o\xf1\xf3@example.com] tests/test_utils.py::test_address_valid[\u6211\u8cb7@example.com-\u6211\u8cb7-\u6211\u8cb7@example.com] tests/test_utils.py::test_address_valid[\u7532\u6590\u9ed2\u5ddd\u65e5\u672c@example.com-\u7532\u6590\u9ed2\u5ddd\u65e5\u672c-\u7532\u6590\u9ed2\u5ddd\u65e5\u672c@example.com] tests/test_utils.py::test_address_valid[\u0447\u0435\u0431\u0443\u0440\u0430\u0448\u043a\u0430\u044f\u0449\u0438\u043a-\u0441-\u0430\u043f\u0435\u043b\u044c\u0441\u0438\u043d\u0430\u043c\u0438.\u0440\u0444@example.com-\u0447\u0435\u0431\u0443\u0440\u0430\u0448\u043a\u0430\u044f\u0449\u0438\u043a-\u0441-\u0430\u043f\u0435\u043b\u044c\u0441\u0438\u043d\u0430\u043c\u0438.\u0440\u0444-\u0447\u0435\u0431\u0443\u0440\u0430\u0448\u043a\u0430\u044f\u0449\u0438\u043a-\u0441-\u0430\u043f\u0435\u043b\u044c\u0441\u0438\u043d\u0430\u043c\u0438.\u0440\u0444@example.com] tests/test_utils.py::test_address_valid[\u0909\u0926\u093e\u0939\u0930\u0923.\u092a\u0930\u0940\u0915\u094d\u0937@domain.with.idn.tld-\u0909\u0926\u093e\u0939\u0930\u0923.\u092a\u0930\u0940\u0915\u094d\u0937-\u0909\u0926\u093e\u0939\u0930\u0923.\u092a\u0930\u0940\u0915\u094d\u0937@domain.with.idn.tld] tests/test_utils.py::test_address_valid[foo.bar@example.com-foo.bar-foo.bar@example.com] tests/test_utils.py::test_address_valid[foo.bar@exam-ple.com tests/test_utils.py::test_address_valid[\u03b9\u03c9\u03ac\u03bd\u03bd\u03b7\u03c2@\u03b5\u03b5\u03c4\u03c4.gr-\u03b9\u03c9\u03ac\u03bd\u03bd\u03b7\u03c2-\u03b9\u03c9\u03ac\u03bd\u03bd\u03b7\u03c2@\u03b5\u03b5\u03c4\u03c4.gr] tests/test_utils.py::test_address_invalid[f tests/test_utils.py::test_address_invalid[foo.bar@exam\nple.com tests/test_utils.py::test_address_invalid[foobar] tests/test_utils.py::test_address_invalid[foobar tests/test_utils.py::test_address_invalid[@example.com] tests/test_utils.py::test_address_invalid[foobar@.example.com] tests/test_utils.py::test_address_invalid[foobar@.com] tests/test_utils.py::test_address_invalid[foo tests/test_utils.py::test_address_invalid[foo@bar@example.com] tests/test_utils.py::test_address_invalid[\n@example.com] tests/test_utils.py::test_address_invalid[\r@example.com] tests/test_utils.py::test_address_invalid[\x0c@example.com] tests/test_utils.py::test_address_invalid[ tests/test_utils.py::test_address_invalid[\x1f@example.com] tests/test_utils.py::test_address_invalid["@example.com0] tests/test_utils.py::test_address_invalid["@example.com1] tests/test_utils.py::test_address_invalid[,@example.com] tests/test_utils.py::test_empty_dsn tests/test_utils.py::test_dsn_odd_user tests/test_utils.py::test_import_module tests/test_utils.py::test_import_module_invalid tests/test_utils.py::test_import_no_attr tests/test_utils.py::test_display_as_type[str-str] tests/test_utils.py::test_display_as_type[string-str] tests/test_utils.py::test_display_as_type[value2-typing.Union[str, tests/test_utils.py::test_display_as_type_enum tests/test_utils.py::test_display_as_type_enum_int tests/test_utils.py::test_display_as_type_enum_str tests/test_utils.py::test_lenient_issubclass tests/test_utils.py::test_lenient_issubclass_is_lenient