diff --git a/include/fmt/ostream.h b/include/fmt/ostream.h
index 938d117604a9..18ae820c6877 100644
--- a/include/fmt/ostream.h
+++ b/include/fmt/ostream.h
@@ -49,6 +49,10 @@ template <typename Char> struct test_stream : std::basic_ostream<Char> {
   // Hide all operator<< from std::basic_ostream<Char>.
   void_t<> operator<<(null<>);
   void_t<> operator<<(const Char*);
+
+  template <typename T, FMT_ENABLE_IF(std::is_convertible<T, int>::value &&
+                                      !std::is_enum<T>::value)>
+  void_t<> operator<<(T);
 };
 
 // Checks if T has a user-defined operator<< (e.g. not a member of
diff --git a/test/ostream-test.cc b/test/ostream-test.cc
index 6c2bc412d30f..7be783d54177 100644
--- a/test/ostream-test.cc
+++ b/test/ostream-test.cc
@@ -250,7 +250,8 @@ struct convertible {
   operator T() const { return value; }
 };
 
-TEST(OStreamTest, ConvertibleToCString) {
-  EXPECT_EQ("x", fmt::format("{}", convertible<char>('x')));
+TEST(OStreamTest, DisableBuiltinOStreamOperators) {
+  EXPECT_EQ("42", fmt::format("{:d}", convertible<unsigned short>(42)));
+  EXPECT_EQ(L"42", fmt::format(L"{:d}", convertible<unsigned short>(42)));
   EXPECT_EQ("foo", fmt::format("{}", convertible<const char*>("foo")));
 }