diff --git a/asio/include/asio/ip/address.hpp b/asio/include/asio/ip/address.hpp
index 7cddee2..ad20c45 100644
--- a/asio/include/asio/ip/address.hpp
+++ b/asio/include/asio/ip/address.hpp
@@ -179,7 +179,7 @@
   }
 
   // The type of the address.
-  enum { none, ipv4, ipv6 } type_;
+  enum { ipv4, ipv6 } type_;
 
   // The underlying IPv4 address.
   asio::ip::address_v4 ipv4_address_;
diff --git a/asio/include/asio/ip/basic_endpoint.hpp b/asio/include/asio/ip/basic_endpoint.hpp
index f4c9bdc..a1bae97 100644
--- a/asio/include/asio/ip/basic_endpoint.hpp
+++ b/asio/include/asio/ip/basic_endpoint.hpp
@@ -124,9 +124,9 @@
   /// The protocol associated with the endpoint.
   protocol_type protocol() const
   {
-    if (impl_.is_v6())
-      return InternetProtocol::v6();
-    return InternetProtocol::v4();
+    if (impl_.is_v4())
+      return InternetProtocol::v4();
+    return InternetProtocol::v6();
   }
 
   /// Get the underlying endpoint in the native type.
diff --git a/asio/include/asio/ip/detail/endpoint.hpp b/asio/include/asio/ip/detail/endpoint.hpp
index 42b8f89..847ca4c 100644
--- a/asio/include/asio/ip/detail/endpoint.hpp
+++ b/asio/include/asio/ip/detail/endpoint.hpp
@@ -111,12 +111,6 @@
     return data_.base.sa_family == ASIO_OS_DEF(AF_INET);
   }
 
-  // Determine whether the endpoint is IPv6.
-  bool is_v6() const
-  {
-    return data_.base.sa_family == ASIO_OS_DEF(AF_INET6);
-  }
-
 #if !defined(ASIO_NO_IOSTREAM)
   // Convert to a string.
   ASIO_DECL std::string to_string(asio::error_code& ec) const;
diff --git a/asio/include/asio/ip/detail/impl/endpoint.ipp b/asio/include/asio/ip/detail/impl/endpoint.ipp
index b2ca0d6..dc3e6b3 100644
--- a/asio/include/asio/ip/detail/impl/endpoint.ipp
+++ b/asio/include/asio/ip/detail/impl/endpoint.ipp
@@ -50,7 +50,7 @@
       asio::detail::socket_ops::host_to_network_short(port_num);
     data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY);
   }
-  else if (family == ASIO_OS_DEF(AF_INET6))
+  else
   {
     data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6);
     data_.v6.sin6_port =
@@ -66,13 +66,6 @@
     data_.v6.sin6_addr.s6_addr[14] = 0, data_.v6.sin6_addr.s6_addr[15] = 0;
     data_.v6.sin6_scope_id = 0;
   }
-  else
-  {
-    data_.v4.sin_family = ASIO_OS_DEF(AF_UNSPEC);
-    data_.v4.sin_port =
-      asio::detail::socket_ops::host_to_network_short(port_num);
-    data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY);
-  }
 }
 
 endpoint::endpoint(const asio::ip::address& addr,
@@ -90,7 +83,7 @@
           static_cast<asio::detail::u_long_type>(
             address_cast<address_v4>(addr).to_ulong()));
   }
-  else if (addr.is_v6())
+  else
   {
     data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6);
     data_.v6.sin6_port =
@@ -103,18 +96,11 @@
       static_cast<asio::detail::u_long_type>(
         v6_addr.scope_id());
   }
-  else
-  {
-    data_.v4.sin_family = ASIO_OS_DEF(AF_UNSPEC);
-    data_.v4.sin_port =
-      asio::detail::socket_ops::host_to_network_short(port_num);
-    data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY);
-  }
 }
 
 void endpoint::resize(std::size_t new_size)
 {
-  if (new_size > sizeof(data_))
+  if (new_size > sizeof(asio::detail::sockaddr_storage_type))
   {
     asio::error_code ec(asio::error::invalid_argument);
     asio::detail::throw_error(ec);
@@ -123,28 +109,28 @@
 
 unsigned short endpoint::port() const
 {
-  if (is_v6())
+  if (is_v4())
   {
     return asio::detail::socket_ops::network_to_host_short(
-        data_.v6.sin6_port);
+        data_.v4.sin_port);
   }
   else
   {
     return asio::detail::socket_ops::network_to_host_short(
-        data_.v4.sin_port);
+        data_.v6.sin6_port);
   }
 }
 
 void endpoint::port(unsigned short port_num)
 {
-  if (is_v6())
+  if (is_v4())
   {
-    data_.v6.sin6_port
+    data_.v4.sin_port
       = asio::detail::socket_ops::host_to_network_short(port_num);
   }
   else
   {
-    data_.v4.sin_port
+    data_.v6.sin6_port
       = asio::detail::socket_ops::host_to_network_short(port_num);
   }
 }
@@ -158,7 +144,7 @@
         asio::detail::socket_ops::network_to_host_long(
           data_.v4.sin_addr.s_addr));
   }
-  else if (is_v6())
+  else
   {
     asio::ip::address_v6::bytes_type bytes;
 #if defined(ASIO_HAS_STD_ARRAY)
@@ -168,10 +154,6 @@
 #endif // defined(ASIO_HAS_STD_ARRAY)
     return asio::ip::address_v6(bytes, data_.v6.sin6_scope_id);
   }
-  else
-  {
-    return asio::ip::address();
-  }
 }
 
 void endpoint::address(const asio::ip::address& addr)
diff --git a/asio/include/asio/ip/impl/address.ipp b/asio/include/asio/ip/impl/address.ipp
index e7745b4..664c53d 100644
--- a/asio/include/asio/ip/impl/address.ipp
+++ b/asio/include/asio/ip/impl/address.ipp
@@ -30,7 +30,7 @@
 namespace ip {
 
 address::address()
-  : type_(none),
+  : type_(ipv4),
     ipv4_address_(),
     ipv6_address_()
 {
@@ -158,81 +158,46 @@
 
 std::string address::to_string() const
 {
-  switch (type_)
-  {
-  case ipv4:
-    return ipv4_address_.to_string();
-  case ipv6:
+  if (type_ == ipv6)
     return ipv6_address_.to_string();
-  default:
-    bad_address_cast ex;
-    asio::detail::throw_exception(ex);
-    return std::string();
-  }
+  return ipv4_address_.to_string();
 }
 
 std::string address::to_string(asio::error_code& ec) const
 {
-  switch (type_)
-  {
-  case ipv4:
-    return ipv4_address_.to_string(ec);
-  case ipv6:
+  if (type_ == ipv6)
     return ipv6_address_.to_string(ec);
-  default:
-    ec = asio::error::invalid_argument;
-    return std::string();
-  }
+  return ipv4_address_.to_string(ec);
 }
 
 bool address::is_loopback() const
 {
-  switch (type_)
-  {
-  case ipv4:
-    return ipv4_address_.is_loopback();
-  case ipv6:
-    return ipv6_address_.is_loopback();
-  default:
-    return false;
-  }
+  return (type_ == ipv4)
+    ? ipv4_address_.is_loopback()
+    : ipv6_address_.is_loopback();
 }
 
 bool address::is_unspecified() const
 {
-  switch (type_)
-  {
-  case ipv4:
-    return ipv4_address_.is_unspecified();
-  case ipv6:
-    return ipv6_address_.is_unspecified();
-  default:
-    return false;
-  }
+  return (type_ == ipv4)
+    ? ipv4_address_.is_unspecified()
+    : ipv6_address_.is_unspecified();
 }
 
 bool address::is_multicast() const
 {
-  switch (type_)
-  {
-  case ipv4:
-    return ipv4_address_.is_multicast();
-  case ipv6:
-    return ipv6_address_.is_multicast();
-  default:
-    return false;
-  }
+  return (type_ == ipv4)
+    ? ipv4_address_.is_multicast()
+    : ipv6_address_.is_multicast();
 }
 
 bool operator==(const address& a1, const address& a2)
 {
   if (a1.type_ != a2.type_)
     return false;
-  if (a1.type_ == address::ipv4)
-    return a1.ipv4_address_ == a2.ipv4_address_;
   if (a1.type_ == address::ipv6)
     return a1.ipv6_address_ == a2.ipv6_address_;
-  return true;
+  return a1.ipv4_address_ == a2.ipv4_address_;
 }
 
 bool operator<(const address& a1, const address& a2)
@@ -241,11 +206,9 @@
     return true;
   if (a1.type_ > a2.type_)
     return false;
-  if (a1.type_ == address::ipv4)
-    return a1.ipv4_address_ < a2.ipv4_address_;
   if (a1.type_ == address::ipv6)
     return a1.ipv6_address_ < a2.ipv6_address_;
-  return false;
+  return a1.ipv4_address_ < a2.ipv4_address_;
 }
 
 } // namespace ip
