Built-in types (as well as types from std) are used everywhere as parameters to functions and constructors while not every instance of those types would be valid inputs.
// There is no guarantee that url is actually a url
void make_http_request(const std::string& url);
// Here we know that it must be a url
void make_http_request(const url& url);
// There is no way of knowing if this is the correct mutex to lock
void insert_into_db(std::mutex mutex);
// Here we know we have the correct mutex
void insert_into_db(db_mutex mutex);
I.4: Make interfaces precisely and strongly typed
Types are the simplest and best documentation, have well-defined meaning, and are guaranteed to be checked at compile time. Also, precisely typed code is often optimized better.
It gives some examples. It doesn't really talk about how far is too far though.