diff --git a/website/docs/configuration/types.html.md b/website/docs/configuration/types.html.md
index 39261c1b3..1751169ca 100644
--- a/website/docs/configuration/types.html.md
+++ b/website/docs/configuration/types.html.md
@@ -59,10 +59,6 @@ a valid representation of a number or boolean value.
* `false` converts to `"false"`, and vice-versa
* `15` converts to `"15"`, and vice-versa
-## The "Any" Type
-
-The type keyword `any` is a special type constraint that accepts any value.
-
## Complex Types
A _complex_ type is a type that groups multiple values into a single value.
@@ -206,3 +202,54 @@ On the other hand, automatic conversion will fail if the provided value
an argument requires a type of `map(string)` and a user provides the object
`{name = ["Kristy", "Claudia", "Mary Anne", "Stacey"], age = 12}`, Terraform
will raise a type mismatch error, since a tuple cannot be converted to a string.
+
+## Dynamic Types: The "any" Constraint
+
+The keyword `any` is a special construct that serves as a placeholder for a
+type yet to be decided. `any` is not _itself_ a type: when interpreting a
+value against a type constraint containing `any`, Terraform will attempt to
+find a single actual type that could replace the `any` keyword to produce
+a valid result.
+
+For example, given the type constraint `list(any)`, Terraform will examine
+the given value and try to choose a replacement for the `any` that would
+make the result valid.
+
+If the given value were `["a", "b", "c"]` -- whose physical type is
+`tuple([string, string, string])`, Terraform analyzes this as follows:
+
+* Tuple types and list types are _similar_ per the previous section, so the
+ tuple-to-list conversion rule applies.
+* All of the elements in the tuple are strings, so the type constraint
+ `string` would be valid for all of the list elements.
+* Therefore in this case the `any` argument is replaced with `string`,
+ and the final concrete value type is `list(string)`.
+
+All of the elements of a collection must have the same type, so conversion
+to `list(any)` requires that all of the given elements must be convertible
+to a common type. This implies some other behaviors that result from the
+conversion rules described in earlier sections.
+
+* If the given value were instead `["a", 1, "b"]` then Terraform would still
+ select `list(string)`, because of the primitive type conversion rules, and
+ the resulting value would be `["a", "1", "b"]` due to the string conversion
+ implied by that type constraint.
+* If the given value were instead `["a", [], "b"]` then the value cannot
+ conform to the type constraint: there is no single type that both a string
+ and an empty tuple can convert to. Terraform would reject this value,
+ complaining that all elements must have the same type.
+
+Although the above examples use `list(any)`, a similar principle applies to
+`map(any)` and `set(any)`.
+
+If you wish to apply absolutely no constraint to the given value, the `any`
+keyword can be used in isolation:
+
+```hcl
+variable "no_type_constraint" {
+ type = any
+}
+```
+
+In this case, Terraform will replace `any` with the exact type of the given
+value and thus perform no type conversion whatsoever.